幾種常見的排序方法

2021-09-07 09:29:35 字數 4129 閱讀 6402

氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。 

以4,2,3,1為例,第一次迴圈4與2比較,交換4,2位置,變為2,4,3,1。4再與3比較,交換4,3,位置,變為2,3,4,1。4再與1比較,變為2,3,1,4。這樣一次迴圈過程就結束了,當前陣列中的最大值被移動到了陣列最後,下一次迴圈時就不需要比較最後乙個元素了.

void bubblesort(int*array,int num)	}}

//交換資料

void swap(int&a,int &b)

根據上面的演算法,當給一組已經有序的資料排序會怎麼樣呢?顯然該演算法還是會重新檢索所有資料,這就引出了及時終止的氣泡排序,如果有一次冒泡過程資料沒有發生交換的話,說明資料已經是有序的,即不需要再排了

//及時終止的氣泡排序

void bubblesortsmarter(int*array,int num)

return flag;

}

選擇排序(selection-sort)是一種簡單直觀的排序演算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。 

n個記錄的檔案的直接選擇排序可經過n-1趟直接選擇排序得到有序結果:

①初始狀態:無序區為r[1..n],有序區為空。

②第1趟排序

在無序區r[1..n]中選出關鍵字最小的記錄r[k],將它與無序區的第1個記錄r[1]交換,使r[1..1]和r[2..n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。

③第i趟排序

第i趟排序開始時,當前有序區和無序區分別為r[1..i-1]和r(i..n)。該趟排序從當前無序區中選出關鍵字最小的記錄 r[k],將它與無序區的第1個記錄r交換,使r[1..i]和r分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區

依舊以4,2,1,3為例,第一趟排序找出最大元素4,將其與陣列最後乙個未排序數字3交換,原序列變為3,2,1,4,第二趟找出未排序的最大元素3,與陣列最後乙個未排序數字1交換,變為1,2,3,4,第三趟再找出未排序的最大元素2,與陣列 最後乙個未排序數字2交換,為1,2,3,4.排序結束

//找出陣列中最大元素 

int maxofarray(int *array,int n)

}

插入排序在實現上,通常採用in-place排序(即只需用到o(1)的額外空間的排序),因而在從後向前掃瞄過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。

2023年shell發明,第乙個突破o(n2)的排序演算法,是簡單插入排序的改進版。它與插入排序的不同之處在於,它會優先比較距離較遠的元素。希爾排序又叫縮小增量排序

先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,具體演算法描述:

假設待排序資料有10個,他們分別是:

49,38,65,97,76,13,27,49,55,04。

增量序列的取值依次為:

//希爾排序專屬插入排序

void insertsort(int*array,int num,int start,int increment),,對於,再將其分為2組,分別為,,合併後為,同理,分組合併後為,最後再將,合併,為。結束

//歸併排序

int* mergesort(int*array,int num)

//將兩個陣列合併 leftlen->left陣列的長度 rightlen->right陣列的長度

int* merge(int*left,int leftlen,int* right,int rightlen)else

} //條件被破壞

if(leftcount==leftlen)。先取乙個基準值k=5,i=0,j=4(陣列最後乙個元素下標),先從陣列右邊開始一次迴圈,此時找的是比k小的元素並交換,a[4]>k,不交換,j-=1,a[3]i&&array[j]>=key;j--);

array[i]=array[j];

for(;j>i&&array[i]<=key;i++);

array[j]=array[i];

} array[i]=key;

quicksort(array,left,i-1);

quicksort(array,i+1,right);

}

快速排序(quicksort)是對氣泡排序的一種改進

計數排序是乙個非基於比較的排序演算法,該演算法於2023年由 harold h. seward 提出。它的優勢在於在對一定範圍內的整數排序時,它的複雜度為ο(n+k)(其中k是整數的範圍),快於任何比較排序演算法

對於陣列a,找出陣列中最大元素max=4、最小元素min=1,重新構造乙個大小為(max+1)的陣列b,找出陣列a中每個值出現的次數,將其存入b,則b,構造陣列c,將b中所有計數累加至c,則c,構造陣列result,則a中元素2排序之後的排名應該為c[2]=3,同理a中元素4的排名為a[4]=5,將其存入result陣列,則result

//找出陣列中最大元素下標 

int maxofarray(int *array,int n)

計數排序是乙個穩定的排序演算法。當輸入的元素是 n 個 0到 k 之間的整數時,時間複雜度是o(n+k),空間複雜度也是o(n+k),其排序速度快於任何比較排序演算法。當k不是很大並且序列比較集中時,計數排序是乙個很有效的排序演算法。

基數排序是按照低位先排序,然後收集;再按照高位排序,然後再收集;依次類推,直到最高位。有時候有些屬性是有優先順序順序的,先按低優先順序排序,再按高優先順序排序。最後的次序就是高優先順序高的在前,高優先順序相同的低優先順序高的在前

對於73, 22, 93, 43, 55, 14, 28, 65, 39, 81

首先根據個位數的數值,在走訪數值時將它們分配至編號0到9的桶子中:

1 81

2 22

3 73 93 43

4 14

5 55 65

8 28

9 39

接下來將這些桶子中的數值重新串接起來,成為以下的數列:

81, 22, 73, 93, 43, 14, 55, 65, 28, 39

接著再進行一次分配,這次是根據十位數來分配:

1 14

2 22 28

3 39

4 43

5 55

6 65

7 73

8 81

9 93

接下來將這些桶子中的數值重新串接起來,成為以下的數列:

14, 22, 28, 39, 43, 55, 65, 73, 81, 93

這時候整個數列已經排序完畢;如果排序的物件有三位數以上,則持續進行以上的動作直至最高位數為止。

//找出陣列中最大元素下標 

int maxofarray(int *array,int n)

return d;

}//基數排序

void radixsort(int*array,int num)

for(int e=0;e基數排序基於分別排序,分別收集,所以是穩定的。但基數排序的效能比桶排序要略差,每一次關鍵字的桶分配都需要o(n)的時間複雜度,而且分配之後得到新的關鍵字序列又需要o(n)的時間複雜度。假如待排資料可以分為d個關鍵字,則基數排序的時間複雜度將是o(d*2n) ,當然d要遠遠小於n,因此基本上還是線性級別的。

基數排序的空間複雜度為o(n+k),其中k為桶的數量。一般來說n>>k,因此額外空間需要大概n個左右。

幾種常見的排序方法。

氣泡排序 氣泡排序是每次都從第乙個元素開始,到最後的k 每迴圈完一次,最後乙個元素位置固定。include include int main void for i 0 i n 1 i k for i 0 i n i return 0 選擇排序 選擇排序每一次迴圈玩從正數的第i個元素位置確定。incl...

JAVA常見的幾種排序方法

日常操作中常見的排序方法有 氣泡排序 快速排序 選擇排序 插入排序 希爾排序,甚至還有基數排序 雞尾酒排序 桶排序 鴿巢排序 歸併排序等。一 氣泡排序 氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有...

常見的幾種排序方法實現

常見的幾種排序方法 氣泡排序 選擇排序 插入排序 選擇排序 1 氣泡排序 每次比較相鄰的像個數,值小的往前冒泡,時間複雜度o n2 2 選擇排序 每次選擇最小的乙個數放在前面,時間複雜度o n2 3 插入排序 每個數插入前面的有序數列中,時間複雜度o n2 4 選擇排序 利用遞迴方法,不斷將小於某個...