排序總結系列二:直接插入排序

直接插入排序(Insertion Sort)的基本思想是:每次將一個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子序列中的適當位置,直到全部記錄插入完成爲止

設數組爲a[0…n-1]。
1.      初始時,a[0]自成1個有序區,無序區爲a[1..n-1]。令i=1
2.      將a[i]併入當前的有序區a[0…i-1]中形成a[0…i]的有序區間。
3.      i++並重復第二步直到i==n-1。排序完成。
//直接插入排序1
void Insertsort1(int a[], int n)
{
int j= 0, k = 0;
for (int i = 1; i < n; i++)
{
//爲a[i]在前面的a[0...i-1]有序區間中找一個合適的位置
for (j = i-1; j >= 0; j--) if (a[j] > a[i]) break;
if (j != i-1) //如找到了一個合適的位置
{
int temp = a[i]; //將比a[i]大的數據向後移
for (k = i-1; k>j; k--) a[k+1] = a[k];
a[k+1] = temp; //將a[i]放到正確位置上
}
}
}
//直接插入排序2
改寫 一下,將搜索和數據後移這二個步驟合併。即每次a[i]先和前面一個數據a[i-1]比較,如果a[i] > a[i-1]說明a[0…i]也是有序的,無須調整。否則就令j=i-1,temp=a[i]。然後一邊將數據a[j]向後移動一邊向前搜索,當有數據a[j]<a[i]時停止並將temp放到a[j + 1]處。
void Insertsort2(int a[], int n)
{
for (int i = 1; i < n; i++)
{
if (a[i] < a[i-1])
{
int temp = a[i];
int j = i - 1;
for ( ; j >= 0 && a[j] > temp; j--) a[j + 1] = a[j];
a[j+1] = temp;
}
}
}
//直接插入排序3
再對將a[j]插入到前面a[0…j-1]的有序區間所用的方法進行改寫,用數據交換代替數據後移。如果a[j]前一個數據a[j-1] > a[j],就交換a[j]和a[j-1],再j--直到a[j-1] <= a[j]。這樣也可以實現將一個新數據新併入到有序區間。
void Insertsort3(int a[], int n)
{
for (int i = 1; i < n; i++)
{
int j = i - 1;
for (; j >= 0 && a[j]>a[j+1]; j--) Swap(a[j], a[j+1]);//等於將大數一個勁交換到後面
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章