一、原理:
每一趟排序(例如第 i 趟,其中 i = 0, 1, …, n - 2),在後面 n - i 個待排記錄中選出關鍵字最小的元素(下標為 index),與第 i 個記錄交換,直至全部待排序的資料元素排完。由於排到 n - 1 趟時,前 n - 1 個元素已然有序,則剩餘的乙個元素自然也有序,因此一共需要排 n - 1 趟(外層迴圈 n - 1 次)。設整個待排記錄序列有 n 個記錄,則第 i 趟選擇具有最小資料元素時所需的比較次數總是 n - i - 1 次,因為第 i 趟排序時,前 i 個資料已經排好序,不需要再進行比較,只需與後 n - i - 1 個元素進行比較(內層迴圈從 i + 1 到 n - 1)。
二、**及注釋:
void selectsort(int n, int *arr)
} // 將最小值與下標為 i 的資料進行交換
temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}}
三、演算法效能分析:
當輸入規模為 n = 10000、20000、30000、40000、50000 時,執行程式,可以得到在不同輸入規模下,20 組隨機樣本資料執行選擇排序的單組執行時間及平均執行時間為:
理論上來說,選擇排序的時間複雜度為 o(n^2)。同時,由上圖可以看出,當 n = 10000 時,20 組樣本排序的平均執行為 33.5927 ms。以輸入規模為 10000 的資料執行時間為基準點,則理論上的平均執行時間為:t = k * n^2,(k 為常數),帶入 t = 33.5927ms、n = 10000,可得:k = t / n2 = 33.5927 / 100002 ;
所以,在相應輸入規模下,選擇排序的理論執行時間為:
根據上表,可以作出選擇排序理論效率曲線和實測效率曲線如下:
如上圖表,是選擇排序的理論效率曲線和實測效率曲線,其中位於上方的資料標籤是實測效率曲線的標註,位於下方的資料標籤是理論效率曲線的標註。由圖表我們可以看出,兩條折線僅存在細小差異。
首先,不管是理論效率曲線還是實測效率曲線,都滿足拋物線 y = k * n^2 在某個定義域的一段曲線(其中 k 為係數)。這與我們的理論認知也是相一致的。
我們知道,在選擇排序過程中,所需進行記錄移動的操作次數較少,其最小值為 0,即序列本來就有序,1 次都不需移動;移動操作次數最大值為 3 (n - 1)。然而,無論記錄的初始排列如何,所需進行的關鍵字間的比較次數相同,均為 n (n - 1) / 2。因此,總的時間複雜度是 o(n^2),這也是理論效率曲線所反映出來的。而實測效率曲線與理論效率曲線基本相符,隨著輸入規模的增大,實際消耗時間略高於理論消耗時間。原因可能有兩個,其一是隨著規模的增大,移動操作(賦值操作)對時間消耗的影響也隨之擴大;其二是與程式執行時電腦的 cpu 利用率有關,若程式執行時有其他程式占用 cpu 資源,也會影響到排序的時間。
演算法 一 選擇排序
選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小元素,然後放到排序序列末尾 目前已被排序的序列 以此類推,直到所有元素均排序完畢。維基百科 include inclu...
排序演算法 選擇排序
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...