插入排序法(Insert Sort)是逐一將數組中的元素與已排序好的元素進行比較,再將該數組元素插入到適當的位置。
下面利用數組6、4、9、8、3的由小到大排序過程來說明插入排序法的演算方式。
步驟一 6
步驟二 6 插入4 通過與6的比較,將4插入到6前得到 4、6
步驟三 4 、6 插入9 通過逐一與4、6比較最終插入到6後 4 、6、9
步驟四 4、6 、9 插入8 通過逐一與4、6、9比較最終插入到6和9中間 4、6、8、9
步驟五 4、6 、8 、9 插入3 通過逐一與4、6、8、9比較最終插入到4前 3、4 、6 、8、9
由上可知:總的比較次數爲1+2+……+(n-1)這裏n表示數組長度 共n*(n-1)/2次
總結插入排序性質:
1、最壞與平均情況都需要比較n*(n-1)/2次;
2、插入排序是穩定的排序法,因爲插入排序不改變原來整體的排列順序;
3、插入排序只需額外的一個空間,其空間複雜度最佳爲O(1);
4、插入排序法適用於大部分數據已經排過序或已排序的數組新增數據後進行排序;
5、插入排序法會造成大量的數據移動,因此建議在鏈表結構上使用。
下面是程序實現插入排序法:
/*
[名稱]:插入排序法
*/
#include<iostream>
#define SIZE 6
using namespace std;
void inputarr(int arr[],int len);//輸入數組元素函數
void show(int arr[],int len);//顯示數組元素函數
void insert(int arr[],int len);//聲明插入排序法函數
void swap(int &x,int &y);
int main()
{
int data[SIZE];
inputarr(data,SIZE);
cout<<"您輸入的原始數組爲:";
show(data,SIZE);
insert(data,SIZE);
system("pause");
return 0;
}
void inputarr(int arr[],int len)
{
for(int i=0;i<len;i++)
{
cout<<"請輸入第"<<i+1<<"個元素:";
cin>>arr[i];
}
}
void show(int arr[],int len)
{
for(int i=0;i<len;i++)
cout<<arr[i]<<" ";
cout<<endl;
}
void insert(int arr[],int len)
{
int copylen=len;
while(--len)
{
for(int i=0;i<copylen-len;i++)
{
if(arr[copylen-len]<arr[i])
{
swap(arr[copylen-len],arr[i]);
}
}
cout<<"第"<<copylen-len<<"掃描";
for(int i=0;i<copylen;i++)
cout<<arr[i]<<" ";
cout<<endl;
}
}
void swap(int &x,int &y)
{
x=x+y;
y=x-y;
x=x-y;
}
輸出結果: