小編給大家分享一下c#中如何實現(xiàn)選擇排序,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
公司主營業(yè)務(wù):網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出和靜免費做網(wǎng)站回饋大家。
選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理是每一次從待排序的數(shù)據(jù)元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數(shù)據(jù)元素排完。
選擇排序:
思想
n個記錄的文件的直接選擇排序可經(jīng)過n-1趟直接選擇排序得到有序結(jié)果:
①初始狀態(tài):無序區(qū)為R[1..n],有序區(qū)為空。
②第1趟排序
在無序區(qū)R[1..n]中選出關(guān)鍵字最小的記錄R[k],將它與無序區(qū)的第1個記錄R[1]交換,使R[1..1]和R[2..n]分別變?yōu)橛涗泜€數(shù)增加1個的新有序區(qū)和記錄個數(shù)減少1個的新無序區(qū)。
……
③第i趟排序
第i趟排序開始時,當前有序區(qū)和無序區(qū)分別為R[1..i-1]和R(i..n)。該趟排序從當前無序區(qū)中選出關(guān)鍵字最小的記錄 R[k],將它與無序區(qū)的第1個記錄R交換,使R[1..i]和R分別變?yōu)橛涗泜€數(shù)增加1個的新有序區(qū)和記錄個數(shù)減少1個的新無序區(qū)。
因為實現(xiàn)方法比較多,也易實現(xiàn),故只給出一種代碼以下并非最優(yōu)算法或者有所改進和優(yōu)化。
因為改進和優(yōu)化的選擇排序可能存在BUG,并且實現(xiàn)和一下代碼差不多,故而,不在一一列舉。
void SelectiongSort(int* a, size_t size) //選擇排序 { assert(a); int min; for (int i = 0; i < size ; i++) { min = i; for (int j = i + 1; j < size; j++) if (a[j] < a[min]) min = j; swap(a[i], a[min]); } }
選擇排序的交換操作介于 0 和 (n - 1) 次之間。選擇排序的比較操作為 n (n - 1) / 2 次之間。選擇排序的賦值操作介于 0 和 3 (n - 1) 次之間。
比較次數(shù)O(n^2),比較次數(shù)與關(guān)鍵字的初始狀態(tài)無關(guān),總的比較次數(shù)N=(n-1)+(n-2)+...+1=n*(n-1)/2。交換次數(shù)O(n),最好情況是,已經(jīng)有序,交換0次;最壞情況交換n-1次,逆序交換n/2次。交換次數(shù)比冒泡排序少多了,由于交換所需CPU時間比比較所需的CPU時間多,n值較小時,選擇排序比冒泡排序快。選擇排序是給每個位置選擇當前元素最小的,比如給第一個位置選擇最小的,在剩余元素里面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個元素不用選擇了,因為只剩下它一個最大的元素了。那么,在一趟選擇,如果一個元素比當前元素小,而該小的元素又出現(xiàn)在一個和當前元素相等的元素后面,那么交換后穩(wěn)定性就被破壞了。
堆排序
堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節(jié)點的值都不大于其父節(jié)點的值,即A[PARENT[i]] >= A[i]。在數(shù)組的非降序排序中,需要使用的就是大根堆,因為根據(jù)大根堆的要求可知,最大的值一定在堆頂。
既然是堆排序,自然需要先建立一個堆,而建堆的核心內(nèi)容是調(diào)整堆,使二叉樹滿足堆的定義(每個節(jié)點的值都不大于其父節(jié)點的值)。
(此處本欲給出圖片,但因網(wǎng)站的問題,便不給出,望讀者見諒。)
void Adjust(int* a, int i, int size) { assert(a); int parent = i; int child = 2*i +1; while(child < size) { if(child+1 < size && a[child+1]>a[child]) ++child; if(a[parent] < a[child]) { swap(a[parent],a[child]); parent =child; child = 2*parent +1; } else break; } } void HeapSort(int* a, size_t size) //堆排序 { for(int i = (size-2)/2 ; i >0; --i) Adjust(a,i,size); for(int i = 0;i算法分析
堆排序的時間,主要由建立初始堆和反復重建堆這兩部分的時間開銷構(gòu)成,它們均是通過調(diào)用Heapify實現(xiàn)的。
平均性能 O(N*logN)。
其他性能
由于建初始堆所需的比較次數(shù)較多,所以堆排序不適宜于記錄數(shù)較少的文件。
堆排序是就地排序,輔助空間為O(1).
它是不穩(wěn)定的排序方法。(排序的穩(wěn)定性是指如果在排序的序列中,存在前后相同的兩個元素的話,排序前 和排序后他們的相對位置不發(fā)生變化)
以上是“c#中如何實現(xiàn)選擇排序”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)頁名稱:c#中如何實現(xiàn)選擇排序
文章位置:http://weahome.cn/article/gsjpgh.html