zoukankan      html  css  js  c++  java
  • 插入排序

        插入排序是最基本基于比较的排序方法,其时间复杂度为Ο(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 }
  • 相关阅读:
    TCP源码—连接建立
    TCP系列02—连接管理—1、三次握手与四次挥手
    TCP系列01—概述及协议头格式
    ubuntu软件管理apt与dpkg
    318. Maximum Product of Word Lengths
    317. Shortest Distance from All Buildings
    316. Remove Duplicate Letters
    315. Count of Smaller Numbers After Self
    314. Binary Tree Vertical Order Traversal
    313. Super Ugly Number
  • 原文地址:https://www.cnblogs.com/nicganon/p/3728598.html
Copyright © 2011-2022 走看看