C 實現排序演算法之選擇排序

2021-10-03 12:18:43 字數 2338 閱讀 1801

c++實現排序演算法之選擇排序:

選擇排序(selection sort)是一種簡單直觀的排序演算法。它的工作原理是:第一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始位置,然後再從剩餘的未排序元素中尋找到最小(大)元素,然後放到已排序的序列的末尾。以此類推,直到全部待排序的資料元素的個數為零。選擇排序是不穩定的排序方法。

時間複雜度:o(n²);

演算法穩定性:不穩定的排序演算法;

基本選擇排序:

選擇排序輸出的是原序列的乙個重排;,使得a1*<=a2*<=a3*<=…<=an*

排序演算法有很多,包括插入排序,氣泡排序,堆排序,歸併排序,選擇排序,計數排序,基數排序,桶排序,快速排序等。插入排序,堆排序,選擇排序,歸併排序和快速排序,氣泡排序都是比較排序,它們通過對陣列中的元素進行比較來實現排序,其他排序演算法則是利用非比較的其他方法來獲得有關輸入陣列的排序資訊。

思想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個的新無序區。

解釋對比陣列中前乙個元素跟後乙個元素的大小,如果後面的元素比前面的元素小則用乙個變數k來記住他的位置,接著第二次比較,前面「後乙個元素」現變成了「前乙個元素」,繼續跟他的「後乙個元素」進行比較如果後面的元素比他要小則用變數k記住它在陣列中的位置(下標),等到迴圈結束的時候,我們應該找到了最小的那個數的下標了,然後進行判斷,如果這個元素的下標不是第乙個元素的下標,就讓第乙個元素跟他交換一下值,這樣就找到整個陣列中最小的數了。然後找到陣列中第二小的數,讓他跟陣列中第二個元素交換一下值,以此類推。

演算法效能:

時間複雜度

選擇排序的交換操作介於 0 和 (n - 1) 次之間。選擇排序的比較操作為 n (n - 1)/ 2 次之間。選擇排序的賦值操作介於 0 和 3(n - 1)次之間。

比較次數o(n^2),比較次數與關鍵字的初始狀態無關,總的比較次數n=(n-1)+(n-2)+…+1=n*(n-1)/2。交換次數o(n),最好情況是,已經有序,交換0次;最壞情況交換n-1次,逆序交換n/2次。交換次數比氣泡排序少多了,由於交換所需cpu時間比比較所需的cpu時間多,n值較小時,選擇排序比氣泡排序快。

其他排序演算法的複雜度如右圖所示。

穩定性選擇排序是給每個位置選擇當前元素最小的,比如給第乙個位置選擇最小的,在剩餘元素裡面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個元素不用選擇了,因為只剩下它乙個最大的元素了。那麼,在一趟選擇,如果乙個元素比當前元素小,而該小的元素又出現在乙個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。比較拗口,舉個例子,序列5 8 5 2 9,我們知道第一遍選擇第1個元素5會和2交換,那麼原序列中兩個5的相對前後順序就被破壞了,所以選擇排序是乙個不穩定的排序演算法。

//選擇排序

#include

#include

#include

#define max 10

using

namespace std;

void

swap

(int

* a,

int* b)

void

print

(int arr,

int length)

cout << endl;

}//方法一:

void

select

(int arr,

int length)}}

}//方法二:

//void select(int arr, int length)

//// }

// if (min != i)

//

// }

//}void

main()

cout <<

"排序前:"

<< endl;

print

(arr, max)

;select

(arr, max)

; cout <<

"排序後:"

<< endl;

print

(arr, max)

;system

("pause");

}

排序演算法C 實現之選擇排序詳解

將無序陣列變為有序陣列 通過迴圈,每次選出在當前的剩餘元素中最小的元素,使得這些選出的元素構成有序陣列 using system namespace selectionsort program ps new program ps.selectsort a console.writeline 排序結果...

選擇排序演算法之C 實現

選擇排序演算法,和上篇講的冒泡演算法很類似.很容易混淆理解.所以這篇緊接著就講選擇排序演算法.上篇講過,之所以叫氣泡排序,是因為從第乙個數開始和自己相鄰的元素做兩兩比較,哪個最大就後置,然後這樣第二個元素就比第乙個元素大,用同樣的方法就保證了第三個元素又比第二個元素要大.不斷重複這個過程,最後乙個元...

選擇排序 (C ) 排序演算法 (遞迴實現)

排序,顧名思義,是將若干個元素按其大小關係排出乙個順序。形式化描述如下 有n個元素a 1 a 2 a n 從小到大排序就是將它們排成乙個新順序a i 1 a i 2 a i n i k 為這個新順序。選擇排序的思想極其簡單,每一步都把乙個最小元素放到前面,如果有多個相等的最小元素,選擇排位較考前的放...