• 插入排序


        插入排序是最基本基于比较的排序方法,其时间复杂度为Ο(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 }
  • 相关阅读:
    linux环境下的makefile文件的编写(zz)
    linux 中vim的退格键的使用问题
    Design Complier Synthesis Script Templet
    Synthesis Summary 逻辑综合总结
    .net加密
    timestamp (TransactSQL) 时间戳
    ADO.NET连接池
    ASP.NET Web数据控件
    高效的读取二进制数据
    GridView
  • 原文地址:https://www.cnblogs.com/nicganon/p/3728598.html
Copyright © 2020-2023  润新知