名稱 選擇排序 簡單選擇排序和堆排序

2021-08-14 10:08:35 字數 1149 閱讀 9520

/*

名稱:選擇排序—簡單選擇排序和堆排序

說明:

對於簡單選擇排序來說,其主要的演算法思想是每次從後面沒確定的自序列中選取乙個最小的(如果是從小到大排序)元素,與當前元素進行交換。其基本的演算法時間複雜度為:o(n2)。對於這個演算法來說,其比較次數與初始的序列狀態沒關係,無論如何,都需要進行n(n-2)/2次比較。由於其在確定元素位置的時候用到了交換,這就造成了對於相同關鍵字的元素,交換之後前後順序可能發生變化。因此,這是乙個不穩定的排序演算法。

對於堆排序來說,雖然其邏輯是二叉樹的結構,但是其儲存的物理結構確確實實是乙個順序陣列。(這應該算是乙個理解邏輯結構和儲存結構區別的好例子了)。其演算法思想是:把一列元素看成乙個堆,乙個父親結點大於子結點的堆(和二叉排序樹不一樣),這樣你會發現,在這列元素中已經包含了某種特定關係的自序列。而這個關係就是父結點大於子結點,這樣在每次排序時,就不用搜尋所有元素,只要對特定的元素進行排序即可,即調整序列依然成為堆。在我看來,這應該是堆排序能大大降低時間複雜度的原因。其最終的時間複雜度為o(nlog2n)。還有由於它也是基於交換的,所以它也是乙個不穩定的演算法。還要補充一點的是,對堆的操作涉及到初始化建堆和對堆進行調整。

#include

using

namespace

std;

//簡單選擇排序

void selectsort(int elem,int n)

}}//向下調整

void adjustdown(int elem,int pos,int len)

}elem[pos] = elem[0]; //被篩選結點的值放入最終的位置

}//初始化建立大根堆

void buildmaxheap(int elem,int len)

//堆排序

void heapsort(int elem,int len)

}

總結:寫了幾個經典的排序演算法後,隱隱的有點感覺,有很多改進的排序演算法都是利用已知序列間的部分有序自序列,或者自序列中含有某種特定關係的。當然這種自序列可能一開始並不存在,需要自己去創造。比如說堆排序、shell排序。其實總某種角度上說,快速排序也算是,因為其每次選取基準後,就把原序列分成了兩個自序列,使得下一次排序時只要在自序列中進行就可以了。

選擇排序 簡單選擇排序

在要排序的一組數中,選出最小 或者最大 的乙個數與第1個位置的數交換 然後在剩下的數當中再找最小 或者最大 的與第2個位置的數交換,依次類推,直到第n 1個元素 倒數第二個數 和第n個元素 最後乙個數 比較為止。第一趟,從n個記錄中找出關鍵碼最小的記錄與第乙個記錄交換 第二趟,從第二個記錄開始的n ...

選擇排序 簡單選擇排序

1.選擇排序 簡單選擇排序,堆排序 與交換排序 氣泡排序,快速排序 的區別 每次比較如果發現較小的元素在後面,就交換兩個相鄰的元素。而選擇排序演算法的改進在於 先並不急於調換位置,先從a 1 開始逐個檢查,看哪個數最小就記下該數所在的位置p,等一躺掃瞄完畢,再把a p 和a 1 對調,這時a 1 到...

選擇排序 簡單選擇排序

在要排序的一組數中,選出最小 或者最大 的一 個數與第1個位置的數交換 然後在剩下的數當中再找最小 或者最大 的與第2個位置的數交換,依次類推,直到第n 1個元素 倒數第二個數 和第n個元素 最後 乙個數 比較為止。第一趟,從n 個記錄中找出關鍵碼最小的記錄與第乙個記錄交換 第二趟,從第二個記錄開始...