演算法 排序(7)

2021-04-24 19:21:30 字數 1099 閱讀 3226

選擇排序(selection sort)的基本思想是:每一趟從待排序的記錄中選出關鍵字最小的記錄,順序放在已排好序的子檔案的最後,直到全部記錄排序完畢。

常用的選擇排序方法有直接選擇排序和堆排序。

直接選擇排序(straight selection sort)

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趟直接選擇排序得到有序結果。

2、直接選擇排序的過程

對初始關鍵字為49、38、65、97、76、13、27和49的檔案進行直接選擇排序的過程【參見動畫演示】

3、演算法描述

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

void selectsort(seqlist r)

{int i,j,k;

for(i=1;i(1)關鍵字比較次數

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

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

(2)記錄的移動次數

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

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

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

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

(4)穩定性分析

直接選擇排序是不穩定的

【例】反例[2,2,1]

排序演算法 7 歸併排序

歸併排序思想 多次將兩個或兩個以上的有序表合併成乙個新的有序表。最簡單的 歸併 是直接將兩個有序的子表合併成乙個有序的表。歸併排序 2 路歸併實現 void merge int r,int low,int mid,int high else 將第1段餘下的部分複製到r1 while i mid 將第...

排序演算法 7 堆排序

參考文章 前言 堆排序 快速排序 歸併排序的平均時間複雜度都為o n logn 要弄清楚堆排序,就要先了解下二叉堆這種資料結構。本文不打算完全講述二叉堆的所有操作,而是著重講述堆排序中要用到的操作。比如我們建堆的時候可以採用堆的插入操作 將元素插入到適當的位置,使新的序列仍符合堆的定義 將元素乙個乙...

排序演算法7 歸併排序

歸併排序 歸併排序的演算法思想 將兩個或兩個以上的元素有序序列合併為乙個有序序列。其中,二路歸併排序是最常見的歸併排序。演算法思想 二路歸併排序的主要演算法思想是 假設元素個數是n,將每個元素作為乙個有序的子串行。繼續將相鄰的兩個有序子串行兩兩合併得到 示例 假設待排序元素序列為49,23,66,5...