內排序(一)——插入排序

排序的基本概念

排序的定義

排序指將一個按值任意的數據元素序列轉換爲一個按值有序的數據元素序列;
數學定義如下:
在這裏插入圖片描述

排序的功能和分類

排序的功能如下:
1、能夠將記錄按關鍵字值任意排列的數據文件轉換爲一個記錄按關鍵字值有序排列的數據文件。或者說,能夠將一個按值任意排列的數據元素序列轉換爲一個按值有序排列的數據元素序列。
2、能夠提高查找的時間效率(作爲提高查找操作時間效率的手段);

排序的分類如下:
內排序:參加排序的數據量不大,以致於能夠一次將參加排序的數據全部裝入內存實現排序;

外排序:當參加排序的數據量很大,以致於不能夠一次將參加排序的數據全部裝入內存,排序過程中需要不斷地通過內存與外存之間的數據交換達到排序目的;

排序的性能

排序操作的性能評價主要包括:① 時間性能;② 空間性能;③ 穩定性

1、時間性能
排序過程中元素之間的比較次數與元素的移動次數;(本系列討論各種排序方法的時間複雜度時主要按照最差情況下所需要的比較次數來進行)

2、空間性能
除了存放參加排序的元素之外,排序過程中所需要的其他輔助空間;

3、穩定性
對於值相同的兩個元素,排序前後的先後次序不變,則稱該方法爲穩定性排序方法
否則,稱爲非穩定性排序方法

說明:在所有可能的輸入實例中,只要有一個實例使得該排序方法不滿足穩定性要求,該排序方法就是非穩定的!

插入排序

核心思想
第 i 趟排序將序列的第 i+1個元素插入到一個大小爲 i 且已經按值有序的子序列 (ki-1,1,ki-1,2, …,ki-1,i)的合適位置,得到一個大小爲 i+1 且仍然按值有序的子序列(ki,1, ki,2, …, ki,i+1)。

其中ki,j 表示第i趟排序結束時序列的第j個元素,1≤i≤n-1,1≤j≤n

插入排序的一個完整過程圖示如下:
在這裏插入圖片描述
插入排序算法的C語言實現如下:

void INSERTSORT(keytype K[ ],int n)
{
    int i, j;
    keytype temp;
    for(i=2;i<=n;i++){         //共n-1趟排序
        temp=K[i];                //以下爲一趟排序
        j=i-1;
        while(j>0 && temp<K[j])
            K[j+1]=K[j– –];
        K[j+1]=temp;
    }
}

Q:排序的時間效率與什麼直接有關?
A:主要與排序過程中元素之間的比較次數直接有關。

Q:若原始序列爲一個按值遞增的序列,則排序過程中一共要經過多少次元素之間的比較?
A:由於每一趟排序只需要經過一次元素之間的比較就可以找到被插入元素的合適位置,因此,整個n-1趟排序一共要經過n-1次元素之間的比較。

Q:若原始序列爲一個按值遞減的序列,則排序過程中一共要經過多少次元素之間的比較?
A:由於第i趟排序需要經過 i 次元素之間的比較才能找到被插入元素的合適位置,因此,整個 n-1 趟排序一共要經過 n(n–1)/2 次元素之間的比較,其中
在這裏插入圖片描述

若以最壞的情況考慮,則插入排序算法的時間複雜度爲O(n2) 。插入排序法是一種穩定性排序方法

插入排序的改進(折半插入排序法)

由於插入第 i+1 個元素時,前 i 個元素的序列已經是有序的序列了,在尋找第 i+1 個元素的位置時,可以在 i 個有序序列中使用**二分查找(折半查找)**的方式來提高效率。

折半插入排序法的C語言實現如下:

void BININSERTSORT(keytype K[ ], int n)
{
    int i, j, low, high, mid;
    keytype temp;
    for(i=2;i<=n;i++ ){
        temp=K[i];
        low=1;                          //採用折半查找法確定插入位置
        high=i-1;
        while(low<=high){               //找到位置的標誌:high < low
           mid=(low+high)/2;
           if(temp<K[mid])
               high=mid-1;
           else
               low=mid+1;
       }
       for(j=i-1;j>=low;j--)                    //low即爲插入的位置
          K[j+1]=K[j];
       K[low]=temp;
    }
}

折半插入排序法可能減少比較次數,但不能減少移動次數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章