1. 程式人生 > >資料結構-插入排序(直接插入排序+折半插入排序)

資料結構-插入排序(直接插入排序+折半插入排序)

二、插入排序

1.直接插入排序

這裡寫圖片描述

這裡我們注意,元素的選擇是從第二個元素開始!動態過程如下:

這裡寫圖片描述

遞增的程式碼實現

#include<iostream>
using namespace std;
void insertsort(int a[],int len)
{
    //從第二個元素開始比較
    for(int i=1; i<len; i++)
    {
        //設定一個哨兵,賦值為待插入元素
        int soldier = a[i];
        //從待插入元素開始向前遍歷
        for(int j=i-1; j>=0
; j--) { //若大於前一個元素,則在前一個元素後面賦值 if(soldier>=a[j]) { a[j+1] = soldier; break; } //若小於前一個元素,則繼續向前走,前一個元素後移 else { a[j+1] = a[j]; //若比第一個元素還小,則放在第一個位置上
if(j==0) { a[j] = soldier; } } } } cout<<"排序後為:"<<endl; for(int k=0; k<len; k++) { if(k==0) { cout<<a[k]; } else { cout
<<" "<<a[k]; } } cout<<endl; } int main() { int a[] = {2,4,3,5,1,6}; int len = sizeof(a)/sizeof(int); cout<<"陣列的元素為:"<<endl; for(int k=0; k<len; k++) { if(k==0) { cout<<a[k]; } else { cout<<" "<<a[k]; } } cout<<endl; insertsort(a,len); return 0; }

這裡寫圖片描述

演算法分析:
優點:簡單,穩定

總比較次數
最好:n-1(有序)
最壞:(n+2)(n-1)/2(逆序有序)

總移動次數
最好:0
最壞:(n+4)(n-1)/2

時間複雜度
最好 O(n)
最壞 O(n^2)
平均 O(n^2)

空間複雜度 O(1)

穩定的排序演算法。

因為每次比較時,前面的序列均是有序的,我們在查詢時可以採用不同的查詢方案,不一定要用順序查詢,如果我們用二分查詢,則我們的排序即為:

折半插入排序:(直接附程式碼)

#include<iostream>
using namespace std;
void Binsertsort(int a[],int len)
{
    for(int i=1; i<len; i++)
    {
        int soldier = a[i];
        int low = 0;
        int high = i-1;
        //找到位置
        while(low<=high)
        {
            int mid = (low + high)/2;
            if(soldier<a[mid])
            {
                high = mid -1;
            }
            else
            {
                low = mid + 1;
            }
        }
        //插入
        for(int j=i-1; j>=high+1; --j)
        {
            a[j+1] = a[j];
        }
        a[high+1] = soldier;
    }
    cout<<"排序後為:"<<endl;
    for(int k=0; k<len; k++)
    {
        if(k==0)
        {
            cout<<a[k];
        }
        else
        {
            cout<<" "<<a[k];
        }
    }
    cout<<endl;
}
int main()
{
    int a[] = {2,4,3,5,1,6};
    int len = sizeof(a)/sizeof(int);
    cout<<"陣列的元素為:"<<endl;
    for(int k=0; k<len; k++)
    {
        if(k==0)
        {
            cout<<a[k];
        }
        else
        {
            cout<<" "<<a[k];
        }
    }
    cout<<endl;
    Binsertsort(a,len);
    return 0;
}