zoukankan      html  css  js  c++  java
  • 二分法插入排序

    二分法插入排序 

    算法思想简单描写叙述:
    在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们
    中间的那个元素比,假设小,则对前半再进行折半,否则对后半
    进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间
    的全部元素后移,再把第i个元素放在目标位置上。

    二分法没有排序,仅仅有查找。所以当找到要插入的位置时。移动必须从最后一个记录開始,向后移动一位,再移动倒数第2位,直到要插入的位置的记录移后一位。

    二分插入排序是稳定的,平均时间O(n2)

         void binsort(ref int[] data1)

    1、二分法查找插入位置
      假设R[i]<R[m]成立,那右指针就要向左移动中间指针一位,否则,左指针要向左移动中间指针一位。重复查找,直到左指针大于右指针时停止。
    2
    、后移,有点迷惑,什么时候须要后移呢?有哪些记录须要移动呢?
      尽管我们非常清楚的知道,我们须要后移那些排序码大于R[i]的记录,但难免会问自己这样几个问题。事实上它相当于须要移动从i-1到左指针的记录。
    3
    、插入
      由1中得到的左指针事实上就是元素要插入的位置。

    4、算法

            {

               int left,right,num;

                int middle,j;

                for( int i = 1;i < data1.Length;i++)

                {

                    // 准备

                    left = 0;

                    right = i-1;

                    num = data1[i];

                    

                    // 二分法查找插入位置

                    while( right >= left)

                    {

                        // 指向已排序好的中间位置

                        middle = ( left + right ) / 2;

                        if( num < data1[middle] )

                        // 插入的元素在右区间

                            right = middle-1; 

                        else

                        // 插入的元素在左区间

                            left = middle+1;    

                    }

                    // 后移排序码大于R[i]的记录

                    for( j = i-1;j >= left;j-- )

                    {

                        data1[j+1] = data1[j];

                    }

                    // 插入

                    data1[left] = num;

                }

                        // 插入的元素在左区间

                            left = middle+1;    

                    }

                    // 后移排序码大于R[i]的记录

                    for( j = i-1;j >= left;j-- )

                    {

                        data1[j+1] = data1[j];

                    }

                    // 插入

                    data1[left] = num;

                }


    /* 二分法插入排序的算法源程序*/

    #include<stdio.h>

    #define MAXNUM 100
    typedef int KeyType;
    typedef int DataType;

    typedef struct {
         KeyType key;        /* 排序码字段 */
         /*DataType info;    记录的其他字段 */
    } RecordNode;

    typedef struct {
         int n;                /* n为文件里的记录个数,n<MAXNUM */
         RecordNode record[MAXNUM];
    } SortObject;

    void binSort(SortObject * pvector) {       /* 按递增序进行二分法插入排序 */
         int i, j, left, mid, right;
         RecordNode temp;
         RecordNode *data = pvector->record;
        
         for( i = 1; i < pvector->n; i++ ) {
             temp = data[i];
             left = 0;   right = i-1;            /* 置已排序区间的下、上界初值 */
             while (left <= right) {
                 mid = (left + right)/2;        /* mid指向已排序区间的中间位置 */
                 if (temp.key < data[mid].key)
                     right = mid-1;             /* 插入元素应在左子区间 */
                 else left = mid+1;             /* 插入元素应在右子区间 */
             }
             for (j = i-1;   j >= left;   j--)
                 data[j+1] = data[j];           /* 将排序码大于ki的记录后移 */
             if (left != i) data[left] = temp;
         }
    }

    SortObject vector={10, 49,38,65,97,76,13,27,49,50,101};

    int main(){
         int i;
         binSort(&vector);
         for(i = 0; i < vector.n; i++)
             printf("%d ", vector.record[i]);
         getchar();
         return 0;

    }
  • 相关阅读:
    二进制位运算
    Leetcode 373. Find K Pairs with Smallest Sums
    priority_queue的用法
    Leetcode 110. Balanced Binary Tree
    Leetcode 104. Maximum Depth of Binary Tree
    Leetcode 111. Minimum Depth of Binary Tree
    Leetcode 64. Minimum Path Sum
    Leetcode 63. Unique Paths II
    经典的递归练习
    案例:java中的基本排序
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/3780565.html
Copyright © 2011-2022 走看看