选择排序—简单选择排序(Simple Selection Sort)
基本思想:
在要排序的一組數(shù)中,選出最小(或者最大)的一個(gè)數(shù)與第1個(gè)位置的數(shù)交換;然后在剩下的數(shù)當(dāng)中再找最小(或者最大)的與第2個(gè)位置的數(shù)交換,依次類推,直到第n-1個(gè)元素(倒數(shù)第二個(gè)數(shù))和第n個(gè)元素(最后一個(gè)數(shù))比較為止。
簡(jiǎn)單選擇排序的示例:
?
操作方法:
第一趟,從n 個(gè)記錄中找出關(guān)鍵碼最小的記錄與第一個(gè)記錄交換;
第二趟,從第二個(gè)記錄開始的n-1 個(gè)記錄中再選出關(guān)鍵碼最小的記錄與第二個(gè)記錄交換;
以此類推.....
第i 趟,則從第i 個(gè)記錄開始的n-i+1 個(gè)記錄中選出關(guān)鍵碼最小的記錄與第i 個(gè)記錄交換,
直到整個(gè)序列按關(guān)鍵碼有序。
算法實(shí)現(xiàn):
?? void print(int a[], int n ,int i){cout<<"第"<<i+1 <<"趟 : ";for(int j= 0; j<8; j++){cout<<a[j] <<" ";}cout<<endl; } /*** 數(shù)組的最小值** @return int 數(shù)組的鍵值*/ int SelectMinKey(int a[], int n, int i) {int k = i;for(int j=i+1 ;j< n; ++j) {if(a[k] > a[j]) k = j;}return k; }/*** 選擇排序**/ void selectSort(int a[], int n){int key, tmp;for(int i = 0; i< n; ++i) {key = SelectMinKey(a, n,i); //選擇最小的元素 遞歸if(key != i){tmp = a[i]; a[i] = a[key]; a[key] = tmp; //最小元素與第i位置元素互換}print(a, n , i);} } int main(){int a[8] = {3,1,5,7,2,4,9,6};cout<<"初始值:";for(int j= 0; j<8; j++){cout<<a[j] <<" ";}cout<<endl<<endl;selectSort(a, 8);print(a,8,8); }?
?簡(jiǎn)單選擇排序的改進(jìn)——二元選擇排序
簡(jiǎn)單選擇排序,每趟循環(huán)只能確定一個(gè)元素排序后的定位。我們可以考慮改進(jìn)為每趟循環(huán)確定兩個(gè)元素(當(dāng)前趟最大和最小記錄)的位置,從而減少排序所需的循環(huán)次數(shù)。改進(jìn)后對(duì)n個(gè)數(shù)據(jù)進(jìn)行排序,最多只需進(jìn)行[n/2]趟循環(huán)即可。具體實(shí)現(xiàn)如下
void SelectSort(int r[],int n) { 02. int i ,j , min ,max, tmp; 03. for (i=1 ;i <= n/2;i++) { 04. // 做不超過n/2趟選擇排序 05. min = i; max = i ; //分別記錄最大和最小關(guān)鍵字記錄位置 06. for (j= i+1; j<= n-i; j++) { 07. if (r[j] > r[max]) { 08. max = j ; continue ; //continue不可少,否則可能會(huì)漏掉一些數(shù)據(jù),min的值偏大 09. } 10. if (r[j]< r[min]) { 11. min = j ; 12. } 13. } 14. //該交換操作還可分情況討論以提高效率 15. tmp = r[i-1]; r[i-1] = r[min]; r[min] = tmp; 16. tmp = r[n-i]; r[n-i] = r[max]; r[max] = tmp; 17. 18. } 19.}
總結(jié)
以上是生活随笔為你收集整理的选择排序—简单选择排序(Simple Selection Sort)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FFmpegInterop 库在 Win
- 下一篇: 第三次作业(二)