代码改变世界

插入排序

2014-05-14 20:32  NicGanon  阅读(200)  评论(0编辑  收藏  举报
    插入排序是最基本基于比较的排序方法,其时间复杂度为Ο(n2),最好情况为初始有序,最坏为逆序。
    伪代码如下:
    insertionSort(A,n)
           for i=1 to n
                do key=A[i]
                for j=i-1 to 0
                     if array[i] > key
                        array[j+1] = array[j]
                     else
                        break;
                array[j+1]=i
 
   C++代码如下:
 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 次的比较 和 n次的移动, 可以考虑将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 }