标签:
一. 直接插入排序
算法原理
算法代码
1 template <typename Comparable> 2 void insertSort( vector<Comparable>& a ) 3 { 4 for ( int i = 1; i < a.size(); ++i ) 5 { 6 Comparable temp = a[i]; 7 for ( int j = i-1; j >= 0; --j) 8 if ( a[j] > temp ) 9 a[j+1] = a[j]; 10 a[j+1] = temp; 11 } 12 }
性能分析:
空间复杂度O(1)
时间复杂度:O(N2)
二. 折半插入排序
算法原理
在插入排序基础上进行改进。每次在有序表中查找插入位置时,不按照顺序挨个查找,而是先与有序表中中间的元素进行比较,这样可以查找范围缩至原来的一半。
需要注意的问题
算法代码
void halfInsertSort ( vector<Comparable>& a ) { for (int i = 1; i < a.size(); ++i) { Comparable temp = a[i]; int low = 0, high = i-1; while ( low <= high ) { int mid = ( low + high ) / 2; if ( a[mid] < temp ) low = mid + 1; else high = mid - 1; } }//插入位置为low,low到i-1的元素后移 for ( int j = i - 1; j >= low; --j ) a[j+1] = a[j]; a[low] = temp; }
算法性能
三.希尔排序
template< typename Comparable > void shellSort (vector<Comparable>&a) {//使用希尔增量,a.size()/2, a.size()/4,...1 for (int gap = a.size()/2; gap > 0; gap /= 2) for (int i = gap; i < a.size(); ++i) { Comparable temp = a[i]; int j = i; for ( ; j >= gap && temp < a[j-gap]; j-=gap)//直接插入法 a[j] = a[j-gap];//边查找边后移 a[j] = temp; } }
标签:
原文地址:http://www.cnblogs.com/happygirl-zjj/p/4642934.html