資料結構-插入排序(直接插入排序+折半插入排序)
阿新 • • 發佈:2019-02-13
二、插入排序
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;
}