1. 程式人生 > >排序算法——插入排序

排序算法——插入排序

正序 新的 記錄 9.png bsp cnblogs tor 分享圖片 反序

一、插入排序(insertion sort)

void insertionSort(vector<int> &a)
{
    for(int i=1;i<a.size();++i)
    {
       int tmp=a[i];
       int j;
       for(j=i;j>0&&tmp<a[j-1];--j)
       {
          a[j]=a[j-1];
       }
       //將tmp插入到正確的位置
       a[j]=tmp;       
    }      
}    

思路:

每一次將一個待排序的記錄,按其大小插入到前面已排好序的子序列中(利用“已知位置0到位置 i-1上的元素已經處於排過序的狀態”的事實

過程:

1)初始時,a[0]自成一個有序區,a[1,....,N-1]為無序區,令i=1

2)將a[i]並入當前有序區a[0,...,i-1],形成新的有序區a[0,....,i]

選擇無序區的第一個a[i]作為tmp,與有序區的各項比較,將(位置i之前)所有大於tmp的元素右移,找到 a[j]<tmp 時停下,將tmp插入到a[j+1]處

3)i加1,重復2),直到處理完a[N-1],排序完成

時間復雜度:

  1)內循環中,測試次數對每個 i 值最多是 i+1 次(當輸入是反序時),內循環中的測試次數為(2+3+...+N)=Θ(N2);

  2)如果輸入已排好序(正序),則內層循環都不執行,運行時間是O(N);

  平均運行時間為O(N2)

技術分享圖片

二、Shell排序

排序算法——插入排序