基本概念 直接插入排序是一種最簡單的排序方法,排序過程為:先將第一個元素看作是只有一個元素的有序子表,然後從第二個元素開始,將待排序元素依次插入到前面有序的子表中,直到全部排序完畢。在整個過程中,前面的元素是已經排序號的列表,後面的元素為待排序處理。 基本過程 將第一個元素看作是一個有序的列表,從第 ...
基本概念
直接插入排序是一種最簡單的排序方法,排序過程為:先將第一個元素看作是只有一個元素的有序子表,然後從第二個元素開始,將待排序元素依次插入到前面有序的子表中,直到全部排序完畢。在整個過程中,前面的元素是已經排序號的列表,後面的元素為待排序處理。
基本過程
將第一個元素看作是一個有序的列表,從第二個元素開始將元素與有序部分中的元素比較找到合適的插入位置,將插入位置後的元素依次後移一個位置。在最好的情況下表中的元素已經是有序表只需要比較不需要移動,這是的時間複雜度是O(n)。最壞的情況下,表中的元素是逆序的比較次數達到最大為:∑ni=2 i,總的移動次數也達到最大為∑ni=2 (i+1)。平均的情況下帶排序的元素是隨機的,此時可以去上訴情況的平均值作為平均情況下的時間複雜度總的比較和移動的平均次數約為n2/4。所以直接插入排序的時間複雜度為O(n2)。
排序過程中需要一個輔助空間,所以時間複雜度為O(1)。
如下排序是將列表{ 7,3,5,4,6 }升序的排序過程。
以下是C++代碼實現:
#include <iostream> using namespace std; //創建數組 void CreateArry(int arry[], int len) { cout << "輸入數組的元素。。。" << endl; int key; for (int i = 0; i < len; i++) { cin >> key; arry[i] = key; } } //直接插入排序 void Inert_Sort(int arry[], int len) { int i, j; for (i = 1; i < len; ++i) { int temp = arry[i]; for (j = i - 1; j >= 0; --j) { if (temp < arry[j]) { arry[j + 1] = arry[j]; //在有序列表中比temp值大的元素後羿 } else { break; }//temp大於有序表中的最後一位則不需要移動 } arry[j+1] = temp;//跳出內層迴圈後插入在合適的位置 } } //列印數組 void Print(int arry[], int len) { for (int i = 0; i < len; i++) { cout << arry[i] << " "; } cout << endl; } void test01() { int arry[5]; int len = sizeof(arry) / sizeof(arry[0]); CreateArry(arry, len); Inert_Sort(arry, len); Print(arry, len); } int main() { test01(); system("pause"); return 0; }
運行結果:
輸入待排序序列 7,3,5,4,6