1.基本思想:假設[1...n]為待排序資料的下標,r(i)表示第i個資料,將資料按從小到大(從大到小)的順序排序。第一趟排序假設第乙個資料(即r(1))為最小(最大)的數,並記錄下標,然後將第乙個資料與剩下的未排序資料依次比較,當順序錯誤時,交換這兩個數,一直比較到最後乙個數;第二趟排序時假設第二個資料(即r(2))為最小(最大)的數,並記錄下標,然後將第二個資料與剩下的未排序資料依次比較,當順序錯誤時,交換這兩個數,一直比較到最後乙個數……。
例如:對5,3,4,9,6這五個數進行從小到大的排序。
第一趟:假設r(1)(即5)是最小的數,然後將5與3,4,9,6依次比較。當與3(r(2))比較時,順序錯誤,則交換位置,此時資料順序變為3,5,4,9,6,繼續比較r(1)(即3)與r(3)(即4),r(1)與r(4)、r(1)與r(5)。則第一趟比較後的資料的順序變為:3,5,4,9,6。
第二趟:假設r(2)(即5)為最小的數,依次與4,9,6進行比較,若順序錯誤,則交換兩個數的位置。排序後資料順序變為:3,4,5,9,6
……第四趟:假設r(4)為最小數,並與r(5)比較,若順序錯誤則交換資料位置。排序後為:3,4,5,6,9。
2、總結:從以上例子可以得出兩點:
。若對n個數進行排序,需要進行(n-1)趟;
。自第一趟排序後資料分為有序區和無序區,每一趟排序後有序區增加乙個數,對應的無序區減少乙個數(即每一趟排序後有乙個數歸位,且不再參與排序,類似於氣泡排序)。
3.**:
#include
using namespace std;
intselect_sort
(int a,
int len)}if
(min != i)
//若順序錯誤,則交換資料位置
}return0;
}int
main()
;select_sort
(a,5);
for(
int i =
0; i <
5; i++
)return0;
}
4.時間複雜度分析:
交換次數n: 0 ≤n≤(n - 1),比較次數為 n (n - 1)/ 2 次之間,賦值操作次數m: 0 ≤m≤ 3 (n - 1)。
比較次數與關鍵字的初始狀態無關,總的比較次數n=(n-1)+(n-2)+…+1=n*(n-1)/2。
最好的情況:已經有序,交換0次;最壞情況交換n-1次,逆序交換n/2次。交換次數o(n),比較次數o(n^2)
交換次數比氣泡排序少多了,由於交換所需cpu時間比比較所需的cpu時間多,n值較小時,選擇排序比氣泡排序快。
排序演算法 選擇排序
private static int leftchild int i private static void perc int a,int i,int n for int i 0 ir j break else public static void heasp int r,int n for i 0...
排序演算法 選擇排序
摘自 wiki百科 選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小元素,然後放到排序序列末尾 目前已被排序的序列 以此類推,直到所有元素均排序完畢。c語言實現 vo...
排序演算法 選擇排序
排序演算法作為最基本也是最常用的演算法,是我們必須要掌握的內容。本文從比較基礎的選擇排序演算法開始,進行排序演算法的介紹。思想 選擇排序,顧名思義,就是從一組總數為n的無序陣列中,進行一次遍歷,選擇出最小 最大 的乙個,把它交換到陣列的第0個位置。然後不斷重複該操作,直到最後兩個數。在第 i 次選擇...