1. 程式人生 > >插入排序(InsertSort)思想與實現

插入排序(InsertSort)思想與實現

  在介紹插入排序的思想之前,說一下插入排序的一個重要的優點:插入排序只有在需要排序時才會排序。該演算法的時間複雜度為:O(n^2),接下來我們來了解一下該排序的思想。

(1)插入排序的思想

  插入排序的思想就是:從陣列的下標為0的元素出發,每次向後取一個元素,將該元素插入到前面已排好的子陣列中,以排升序為例,將所要插入的元素插在左邊小於該元素和右邊大於該元素之間的位置,進而形成新的子陣列,直到所有元素全插進來為止。為了更好的理解,我們來看下面的圖片:

由以上圖片中我們知道,原陣列的順序為:5   2   3   8   1。接下來進行分步操作。
  第一步:取陣列第0個元素5,對5進行排序,結果形成了新的子陣列為:5;
  第二步:取陣列的第1個元素2,將2插入第一步所得的子陣列中,發現2應該放在5的左邊,將2插入5的左邊後,結果形成了新的子陣列為:2   5;
  第三步:取陣列的第2個元素3,將3插入第二步所得的子陣列中,發現3應該放在2和5的中間,將3插入2和5的中間後,結果形成了新的子陣列為:2 3   5;
  第四步:取陣列的第3個元素8,將8插入第三步所得的子陣列中,發現8應該放在5的右邊,將8插入5的右邊後,結果形成了新的子陣列為:2 3   5 8;
  第五步:取陣列的第4個元素1,將1插入第四步所得的子陣列中,發現1應該放在2的左邊,將1插入2的左邊後,結果形成了新的子陣列為:1 2 3   5 8;
  最後,由於插入了所有的元素,故排序結束。


(2) 插入排序的實現

  本次實現採用C++的模版程式設計來完成該排序演算法。

#include <iostream>
#include <iterator>

using namespace std;


template<class T,size_t N>
void PrintArr(T (&arr)[N]) {
	copy(arr,arr+N,ostream_iterator<T>(cout," "));
	cout << endl;
}

template<class T,size_t N>
void InsertSort(T (&arr)[N]) {
	for(size_t i=0,j; i<N; i++) {
		T temp(arr[i]);
		for(j=i; j>0 and temp < arr[j-1]; j--) {
		arr[j] = arr[j-1];
		}
		arr[j] = temp;
	}
}


template<class SortFunc>
void Test(SortFunc sort) {
	int arr[] = {5,2,3,8,1};
	cout << "InsertSort:"<<endl;
	sort(arr);
	PrintArr(arr);
}
   
int main(){
	Test(InsertSort<int,5>);
}
原始陣列為:5   2   3   8   1 程式執行結果為:1   2   3   5   8