二分法插入排序

來源:互聯網
上載者:User

標籤:style   color   檔案   width   io   art   

二分法插入排序 

演算法思想簡單描寫敘述:
在插入第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;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.