最近我整理了經常用到的排序演算法。排序就是按關鍵字的遞減或遞增順序對一組記錄重新進行整隊的操作。對於排序來說,主要考慮的因素就是時間複雜度、空間複雜度和演算法的複雜度。
下面我先整理簡單選擇排序,直接插入排序,折半插入排序,希爾排序和氣泡排序這幾種。以下的所有的**都是用
c語言實現的,測試用例是
int
一、簡單選擇排序 1
、排序思想
首先,在帶排序序列中選擇出最小記錄,然後將這個最小資料元素與第乙個記錄交換,第乙個到位,這只是第一趟排序,第二趟就是從第二個記錄到最後乙個記錄中選擇最小的記錄,之後將這個最小記錄與第二個記錄交換,第二個記錄到位,以此類推。進行
n-1趟,序列就有序了。 2
、**實現 //
簡單選擇排序
void selectsort(int *a,int length)
} //將第
i趟的最小值放入
i的位置
t=a[i];
a[i]=a[min];
a[min]=t; }
} 3、效率分析
時間複雜度:在第
i趟選擇排序中,需進行
n-i次關鍵字的比較,交換記錄時需要
3次移動記錄的操作。最好情況就是正序排序,不需要移動記錄,最壞情況即逆序排序,需要移動次數最多為3(
n-1)。一般情況下需要進行比較次數是:
n(n-1)/2
。所以時間複雜度為o(
n2).
空間複雜度:需要乙個輔助工作變數,因此,它的空間複雜度為o(
1)。穩定性:就選擇排序方法本身來講,它是一種穩定的排序方法。但是也可能受到排序方法採用的
「交換記錄
」的策略所影響。
二、直接插入排序 1
、演算法思想
在乙個已排好序的記錄子集的基礎上,每一步將下乙個帶排序的記錄有序的插入到已排好序的記錄子集中,直到將所有記錄全部插入為止。就像打撲克牌的時候,一張張抓牌到自己手中,插入到已排好序的牌的過程。 2
、**實現 //
直接插入排序
void insertsort(int * a,int length)
} }
void insertsort2(int * a,int length)
} 3、效率分析
時間複雜度:
o(n2)
。空間複雜度:o(
1)。穩定性:是穩定的排序方法。
三、折半插入排序 1
、排序思想
折半插入排序是對直接插入排序的改進,直接插入排序插入位置的確定是通過對有序表中記錄按關鍵字逐個比較得到的,而折半插入排序是採用折半查詢在有序表中確定插入位置。 2
、**實現 //
折半查詢插入排序
void binsort(int *a,int length)
for(intj=i-1;j>=low;j--)
a[low]=temp; }
} 3、效率分析
時間複雜度:雖然折半查詢在查詢插入位置的方面效能有所提高,但插入到有序表的過程是不變的,所以時間複雜度還是o(
n2)。
四、希爾排序 1
、排序思想
希爾排序是對直接插入排序的改進,直接插入排序對
n值較小的序列效率較高。希爾排序的基本思想就是先將整個待排記錄序列分割成若干個子串行,對每個子串行分別進行直接插入排序,待整個序列中記錄基本有序時,再對全體記錄進行一次直接插入排序。
希爾排序中子序列的構成不是簡單的逐段分割,而是將相隔某個增量的記錄組成乙個子串行。 2
、**實現
#include
//希爾排序
void shellsort(int *a,int length,int * delta,int n)
} }
int main(void) ;
int b=;
for(inti=0;i<14;i++)
printf("\n");
shellsort(a,14,b,3);
for(i=0;i<14;i++)
printf("\n");
return 0; }
3、效率分析
希爾排序的時效分析是乙個複雜的問題,關鍵字的比較次數與記錄移動的次數依賴於增量因子序列的選取,特定情況下可以準確估算出關鍵字的比較次數和記錄的移動次數。
希爾排序是一種不穩定的排序演算法。
五、氣泡排序 1
、**實現 //
氣泡排序
void bubblesort(int *a,int length)
} }
} 2、效率分析
時間複雜度:o(
n2)。
空間複雜度
:o(1)
。穩定性:穩定。
簡單排序方法
1.冒泡法 void sort int array for int k 0 k 2.選擇法 void sort int array else if j 1 0 for int k 0 k2 有一數列1,1,2,3,5,求第30個數 public class mainclass public stat...
簡單排序方法 氣泡排序
氣泡排序 bubblesort 的基本思想是 將相鄰的記錄的關鍵碼進行比較,若前面記錄的關鍵碼大於後面記錄的關鍵碼,則將它們交換,否則不交換。設待排序的順序表sqlist中有n個記錄,氣泡排序要進行n 1趟,每趟迴圈均是從最後兩個記錄開始。第1趟迴圈到第2個記錄的關鍵碼與第1個記錄的關鍵碼比較後終止...
排序演算法之簡單排序
進入找工作倒計時狀態了,計畫好好複習一下資料結構和相關演算法,估計用兩天時間把見過的排序演算法整理下,首先看一下時間複雜度為o n2 的演算法。首先參考大話資料結構定義乙個鍊錶類 include define maxsize 1000 using namespace std class sqlist...