1. 程式人生 > >常見排序之插入排序

常見排序之插入排序

插入排序

排序思想

直接插入排序就是把待排序的記錄按關鍵字的大小逐個插入到一個已經排好序的有序序列中,直到所有記錄插入完為止。

我們可以假設序列第一個元素是已經排好序的,要插入第i(i>=1)個元素,可以將array[i]與排好序的每個元素相比較,知道找到一個比array[i]要小的元素插入到這個元素後面。原來的元素後移。

void InsertSort(int *array, int size)
{
	int i = 1;
	for(; i < size; i++){
		int key = array[i]; //key是當前要插入的元素
		int end =
i-1; //end指向排好序的最後一個元素 while(end >= 0 && array[end] > key){ array[end+1] = array[end]; end--; } array[end+1] = key; } }

在這裡插入圖片描述

如上圖可見,直接插入排序是穩定的
時間複雜度O(n2)
空間複雜度O(1)
當序列越接近有序排序效率越高

希爾排序

基本思想

先選定一個整數,把待排序序列中所有記錄分成若干組,先對每一組內的記錄進行排序,然後重複上述分組和排序工作,直到分組為1,所有記錄排好序。
void
ShellSort(int *array, int size) { int gap = 3; while(gap--){ int i = gap; for(; i < size; i++){ int end = i-gap; int key = array[i]; while(end >= 0 && array[end] > key){ arra[end+gap] = array[end]; end -= gap; } array[end+gap] = key; } } }

在這裡插入圖片描述

希爾排序是對直接插入排序的優化
gap>1是為了讓序列更接近有序,當gap=1,這樣會更快
希爾排序是不穩定的
平均時間複雜度O(n1.3

~n2)