排序方法總結

2021-08-26 15:27:16 字數 2337 閱讀 6124

第乙個學會的排序演算法就是冒泡演算法啦,聽說有些傢伙連冒泡演算法都寫不出來(偷笑......)。冒泡演算法的時間複雜度是o(n2),和選擇排序的時間複雜度一樣。這是最基本的排序演算法了,時間複雜度這麼高,自然用處也不會多。選擇排序是冒泡演算法昇華了,氣泡排序是兩個兩個隔空辯論打擂,誰大誰到冠軍座椅繼續接受挑戰,內層迴圈是打擂,外層迴圈指定冠軍座椅(嘿嘿)。

void sort(vector&a)

}}

選擇排序其實也是差不多的思想,但有乙個不同,氣泡排序交換值的次數太多啦(叫做換比賽場地吧,每次人家挑戰成功就得把位置讓出來),好可惡,我選擇排序就不想急著交換啊(挑戰成功的選手先別換場地,哥哥把那個寫著冠軍座椅的標籤貼到你那裡去,敗軍之將還在冠軍座椅上喝茶呢),等我找到了真正的冠軍,再把那冠軍請到真正的冠軍座椅上。選擇排序的外迴圈是先把冠軍座椅的標籤記錄下來,內層拿著標籤找冠軍,冠軍找到了就到外層交換座椅。

void sort(vector&a)

a[i] = a[k];

a[k] = temp;

}}

再說插入排序,插入排序的思想和前面哥倆都不同,他是指定一塊有序區,每次都從距離有序區最近的地方拿走元素去有序區找位置,找到了就坐下來,時間複雜度也是o(n2)。

void sort(vector&a)

}

希爾排序是在插入排序的基礎上實現的,第乙個時間複雜度突破o(n2)的排序演算法啊,可喜可賀,還給計算機界的大佬們留下了一道數學難題。插入排序演算法最低效的一種情況就是,當元素剛好大部分以逆序的方式排列時,比較的次數太多,時間複雜度接近o(n2),希爾排序為解決這個問題,每次先想辦法把元素變成部分有序(部分有序的意思是較小的都集中在一端而較大的在另一端)的,它的手段就是:每次先以一定的間隔挑幾個數出來進行插入排序,這個間隔是有講究的,一般來說:h = 3h+1,h初始值為1,最大值不超過待排元素總數,最後一次選用的間隔一定是1,這時候就是平常的插入排序了,那些元素們就不用大老遠的跑到合適位置去了。這個時間複雜度很難計算,數學家們也沒給出個結果,但希爾排序確實比前面那三個哥們要快。

歸併排序是一種效率比較高的遞迴排序演算法,時間複雜度o(nlogn)。歸併排序關鍵在於切分的時候注意別越界以及遞迴返回的條件要搞清楚。

歸併排序的實現有兩種,第一種自頂而下的歸併演算法,每次切分都將未排序的陣列分成兩部分,直至最後一次切分的兩個陣列中各自只有乙個元素,這時候對兩個陣列進行歸併並返回遞迴呼叫的上一層,在這一層對兩個各自有兩個元素的陣列進行歸併,然後又返回更高一層,依次類推,直至最後一次歸併。(這裡,假設元素個數是偶數個,則一一歸,並兩兩歸併,四四歸併......非偶數個元素則略有不同)

//入口引數:待切分陣列a,臨時陣列aux,陣列起始的元素下標lo,最後乙個元素下標hi。

void merge(vector&a,vector&aux, int lo, int mid, int hi)

}void sort(vector&a, vector&aux, int lo, int hi)

第二種自底而上的歸併演算法,對所給的陣列元素,先是依據順序對相鄰的兩個元素進行一一歸併,將這歸併後的元素視為一組,然後對相鄰的兩組元素進行兩兩歸併,四四歸併......,對於奇數個元素的陣列,最後乙個分組的元素會比前面的分組元素數量少。

//入口引數:待切分陣列a,臨時陣列aux,陣列起始的元素下標lo,最後乙個元素下標hi。

void merge(vector&a,vector&aux, int lo, int mid, int hi)

}void sort(vector&a, vector&aux)

快速排序是重頭戲,這是一種用的比較多的而且相當高效的排序演算法,也是面試中常被問到的一種排序演算法。快速排序關鍵也是切分陣列,切分陣列的關鍵在於使用乙個主元,把小於主元的元素都挪到左邊去,大於主元的元素挪到右邊去,怎麼找到要移動的元素和它的目標位置,這裡給出一段**加注釋,做簡要說明:

//入口引數:待切分陣列a,陣列起始的元素下標left,最後乙個元素下標right。

int partition(vector&a, int left, int right)

{ int i = left, j = right;

int temp = a[i];

while(i=temp) j--;//這裡要注意j的邊界條件是落在空位i處的;

if(i&a,int left,int right)

{ if (left這裡展示的是快速排序實現方法中較為普通的一種,為提公升效能有使用三向切分或者在底層小陣列排序時切換成插入排序以利用插入排序對小陣列的高效排序效能。

堆排序,對於處理流動的資料,這是一把尖刀。

to be continue......

排序方法總結

mysort.h ifndef mysort h included define mysort h included 交換排序 氣泡排序,快速排序 void bubblesort int arr,int arrlen int slipforquicksort int arr,int arrleft,...

排序方法總結

一 選擇排序法 1 預設第乙個數已經排序,且預設第乙個數為最小的數,定義min用來存放最小的數在陣列中的位置。2 用min指向的數 即第乙個數 和第二個數比較,如果第乙個數比第二個數小,min指向不變 為0 如果第乙個數比第二個數大,min指向第二個數 為1 3 用min指向的數和第三個數比較,如果...

排序方法總結

選擇排序 public static void selectsort int arr 氣泡排序 public static void bubblesort int arr 插入排序 public static void insertsort int arr 附 swap的兩種方法 swap方法一 p...