十大排序演算法

2021-08-28 05:10:50 字數 1567 閱讀 5553

排序規則:從左至右依次增大

一、基於比較的排序演算法:

插入排序:逐個遍歷未排序序列,將其在已排序序列中從右到左比較,直到遇到比自己小的數,然後將元素插入到那個數的後面,有序序列從左向右生長。

選擇排序:在未排序序列中選擇最小的元素,將其插入到已排序序列的末尾,有序序列從左向右生長。

氣泡排序:從左至右逐個比較相鄰的兩個元素,如果左邊的元素比右邊的大,則交換兩個元素位置,繼續向右比較;如果左邊的元素比右邊的元素小,則繼續比較右邊的元素和右邊的右邊的元素,直到最大的數到達序列的最右端,與上面兩種方法不同,有序序列是從右向左生長。

以上是最容易想到的三種排序演算法,平均時間複雜度為

希爾排序:是改進的插入排序,首先需要將未排序序列分成幾段,比如將長度為n的序列分為m段,每段長度為n/m。應該如何比較呢,是相鄰的段之間進行比較,段與段之間又是如何比較呢,是每段的同樣序號的元素進行比較,比如第i段的第2號元素和第i+1段段第2號元素進行比較,如果後者比前者小,就交換兩個元素的位置。當相鄰的段都比較完了以後,就是使得第i段元素都要比第i+1段對應位置的元素要小,得到了乙個大致的排序。接著將段的長度縮短,使得比較的單位進一步縮小,這樣比較完了以後就得到了段粒度更小的有序序列,接著進一步縮小段長度,直到段長度變為1,此時排序工作已經進行的差不多了,再進行插入排序的時候需要進行的交換工作就少了很多。這個演算法像是氣泡排序和插入排序的混合版,演算法的平均複雜度為

歸併排序:採用分治法的思想,將乙個無序序列分為兩段,再遞迴地一直分下去,直到分到只剩下兩個元素,然後將這兩個元素排序存好,遞迴地操作,將排好序的兩對元素合併為有序的四個元素,將兩對四個元素合併為有序的八個元素依次進行下去,最開始均分的兩組元素合併為一組有序元素,這一演算法的平均時間複雜度為

快速排序:快速排序也是採用遞迴的思想,首先在無序序列中尋找乙個基準,然後將元素分為兩組,一組所有元素都比基準小,一組所有元素都比基準大,然後遞迴地對這兩組元素採用同樣的處理方式,最後就會得到乙個有序的序列,這一演算法的平均時間複雜度為

堆排序:此法是利用大小堆的性質來進行排序,即父元素總是大於等於子元素,或者總是小於等於子元素。假如使用大堆結構,則每次將堆頂元素和堆底元素(底層最右側元素)交換,然後剝離堆底元素,或則序列最大值,然後將堆進行調整使其符合大堆的性質,重複上述操作,有序序列是從右向左生長的,這一演算法的平均時間複雜度為

上述演算法都是基於比較多排序演算法,無法突破時間複雜度

二、非基於比較的排序演算法:

計數排序:此法有一定侷限性,適用於序列最大最小值相差不多並且元素為整數的情況,它需要乙個

桶排序:這個類似於雜湊表,也就是**薄原理。當每次存入乙個**的時候,**薄會根據名字將其新增到對應的索引下,索引就是abcdef... 也就是名字的首字母,這相當於是乙個個大桶,相同首字母的名字都被對映到乙個索引下,然後桶內的名字再按照第二個字母的順序來排序,整個**薄按照索引排序,然後所有名字就這樣有序地排列好了。

基數排序:序列中的元素可以由權重不同的關鍵字組成,比如數字由個位十位百位組成,然後分別對每一位使用計數排序。比如個位為6的分為一組,個位為7的緊鄰其後。分好之後,開始按照十位數字分組,此時原先在同一組的數字可能由於十位不同而分在了不同的組,形成新的排序,然後按照放入順序依次回填,就會得到按照個位十位排序的有序序列。演算法的關鍵在於迭代地使用計數排序。

十大排序演算法

1.非線性時間類排序 時間複雜度未突破 0 nlog 2n 不穩定的四個排序演算法 選擇排序 0 n2 希爾排序 0 n1.3 希爾排序實現python 快速排序 0 n log2 n 0 nlog 2n 0 nlog 2 n 快速排序實現c python 堆排序 0 n log2 n 0 nlog...

十大排序演算法

github 排序演算法是 資料結構與演算法 中最基本的演算法之一。排序演算法可以分為內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序演算法有 插入排序 希爾排序 選擇排序 氣泡排序 歸併排序...

十大排序演算法

1 選擇排序 找到陣列中最小的那個元素,其次,將它和陣列的第乙個元素交換位置。其次,在剩下的元素中找到最小的元素,將它與陣列的第二個元素交換位置。如此往復,直到將整個陣列排序。這種方法我們稱之為選擇排序。public class 選擇排序 system.out.println arrays.tost...