直接選擇排序的節本思想和演算法

2021-06-04 19:17:47 字數 1251 閱讀 1298

1、直接選擇排序的基本思想

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](1≤i≤n-1)。該趟排序從當前無序區中選出關鍵字最小的記錄r[k],將它與無序區的第1個記錄r[i]交換,使r[1..i]和r[i+1..n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。

這樣,n個記錄的檔案的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。

動畫演示**自:

3、演算法描述

直接選擇排序的具體演算法如下:

void selectsort(seqlist r)

//endif

} //endfor

} //seleetsort

4、演算法分析

(1)關鍵字比較次數

無**件初始狀態如何,在第i趟排序中選出最小關鍵字的記錄,需做n-i次比較,因此,總的比較次數為:

n(n-1)/2=0(n2)

(2)記錄的移動次數

當初始檔案為正序時,移動次數為0

檔案初態為反序時,每趟排序均要執行交換操作,總的移動次數取最大值3(n-1)。

直接選擇排序的平均時間複雜度為o(n2)。

(3)直接選擇排序是乙個就地排序

(4)穩定性分析

直接選擇排序是不穩定的

【例】反例[2,

2,1]

源**:

#include /*

直接排序

*/static void straight_sel_sort(int arr, int length);

int main(void)

; straight_sel_sort(arr, 7);

for (i = 0; i < 7; i++)

putchar('\n');

return 0;

}static void straight_sel_sort(int arr, int length)

} if (k != i) //交換arr[i]和arr[k]的值

}}

演算法 排序 選擇排序(直接選擇和堆排序)

這裡介紹兩種選擇排序演算法 直接選擇排序和堆排序 選擇排序基本思想 每一趟從待排序的序列中選出關鍵字最小 最大 的元素,順序放在已排好序的子串行的最後,直到全部元素排序完畢。1 直接選擇排序 基本原理 每一次從待排序序列中選取最小的元素順序放在以排好的序列後面,例如序列r,先從r中選擇最小的元素,將...

排序演算法(直接選擇排序)

為什麼我們要叫直接選擇排序呢?在最開始的時候,待排序區間是整個陣列,從區間選乙個最小的與區間第乙個交換位置,然後將待排序區間從第二個開始,繼續以上操作,直至待排序區間長度為0 我們還是以為例 初始 3 5 7 9 8 6 2 1 4 0 第一趟 05 7 9 8 6 2 1 4 3 第二趟 0 17...

排序演算法 直接選擇排序

選擇排序的基本思想是 每一趟從待排序的記錄中選出關鍵字最小的記錄,順序放入已排序數列的最後,直到全部記錄排序完畢。直接選擇排序是一種簡單直觀的排序演算法。它的工作原理 首先在未排序序列中找到最小 大 元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小 大 元素,然後放到已排序序列...