歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 直接插入排序的三種實現

直接插入排序的三種實現

日期:2017/3/1 9:39:21   编辑:Linux編程

直接插入排序(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。排序完成。

下面給出嚴格按照定義書寫的代碼(由小到大排序):

void Insertsort1(int a[], int n)

{

int i, j, k;

for (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)

{

//將比a[i]大的數據向後移

int temp = a[i];

for (k = i - 1; k > j; k--)

a[k + 1] = a[k];

//將a[i]放到正確位置上

a[k + 1] = temp;

}

}

}

這樣的代碼太長了,不夠清晰。現在進行一下改寫,將搜索和數據後移這二個步驟合並。即每次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)

{

int i, j;

for (i = 1; i < n; i++)

if (a[i] < a[i - 1])

{

int temp = a[i];

for (j = i - 1; j >= 0 && a[j] > temp; j--)

a[j + 1] = a[j];

a[j + 1] = temp;

}

}

再對將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)

{

int i, j;

for (i = 1; i < n; i++)

for (j = i - 1; j >= 0 && a[j] > a[j + 1]; j--)

Swap(a[j], a[j + 1]);

}

PHP 冒泡排序法 http://www.linuxidc.com/Linux/2014-08/105971.htm

經典排序之冒泡排序 http://www.linuxidc.com/Linux/2014-07/104762.htm

Python實現冒泡排序法 http://www.linuxidc.com/Linux/2014-06/103897.htm

Go語言實現冒泡排序 http://www.linuxidc.com/Linux/2014-06/103844.htm

C++ 使用模板實現冒泡排序 http://www.linuxidc.com/Linux/2014-02/96914.htm

Java簡單排序之冒泡排序代碼 http://www.linuxidc.com/Linux/2013-11/92782.htm

冒泡排序優化版,性能近乎翻倍 http://www.linuxidc.com/Linux/2013-09/90710.htm

Copyright © Linux教程網 All Rights Reserved