1 #include <iostream> 2 3 using namespace std; 4 5 void insertSort(int* array,int n); 6 void print(int* array, int n); 7 int main() 8 { 9 const int N = 6; 10 int array[N] = {5,2,4,6,1,3}; 11 print(array,N); 12 insertSort(array,N); 13 print(array,N); 14 } 15 16 void print(int* array, int n) 17 { 18 for (int i=0; i<n; ++i) { 19 cout << array[i] << " "; 20 } 21 cout << endl; 22 } 23 24 25 void insertSort(int* array,int n) 26 { 27 for (int i=1; i<n; ++i) { 28 int key = array[i]; 29 int j = i-1; 30 while (j >= 0) { 31 if (array[j] < key) 32 array[j+1] = array[j]; 33 else 34 break; 35 --j; 36 } 37 array[j+1] = key; 38 } 39 }
以上是原始的插入排序,要经过n2 次的比较 和 n2 次的移动, 可以考虑将while内查找待排序元素应插入位置的方法由遍历改为二分查找,毕竟待插入之前的所有元素都已经有序了,这样可以将比较的次数减少为 nlogn,但是移动的次数仍然是 n2 。
基于二分查找的插入排序代码:
1 #include <iostream> 2 3 using namespace std; 4 5 void insertSort(int* array,int n); 6 void print(int* array, int n); 7 int main() 8 { 9 const int N = 6; 10 int array[N] = {5,2,4,6,1,3}; 11 print(array,N); 12 insertSort(array,N); 13 print(array,N); 14 } 15 16 void print(int* array, int n) 17 { 18 for (int i=0; i<n; ++i) { 19 cout << array[i] << " "; 20 } 21 cout << endl; 22 } 23 24 25 void insertSort(int* array,int n) 26 { 27 for (int i=1; i<n; ++i) { 28 int key = array[i]; 29 int max = i-1, min = 0,mid=0; 30 while (max >= min) 31 { 32 mid = (max + min)/2; 33 if (array[mid] < key) 34 min = mid + 1; 35 else if (array[mid] > key) 36 max = mid -1; 37 else 38 break; 39 40 } 41 int limit; 42 if (array[mid] > key) 43 limit = mid; 44 else 45 limit = mid+1; 46 for (int j=i;j>limit;--j) 47 array[j] = array[j-1]; 48 array[limit] = key; 49 } 50 }