C 排序演算法小結

2022-09-22 19:48:11 字數 3559 閱讀 8256

前言

演算法這個東西其實在開發中很少用到,特別是web開發中,但是演算法也很重要,因為任何的程式,任何的軟體,都是由很多的演算法和資料結構組成的。但是這不意味著演算法對於每個軟體設計人員的實際工作都是很重要的。每個專案特點和需求特殊也導致演算法運用場景上不同。但是個人覺得演算法運用的好的話會給自己在程式設計的時候提供比較好的思路。下面就對一些排序演算法小結一下,就當做自己的乙個筆記吧。

插入排序

1.簡介

插入排序(insertion sort)的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,通常採用in-place排序(即只需用到o(1)的額外空間的排序),因而在從後向前掃瞄過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。

2.演算法描述

一般來說,插入排序都採用in-place在陣列上實現。具體演算法描述如下:

1.從第乙個元素開始,該元素可以認為已經被排序

2.取出下乙個元素,在已經排序的元素序列中從後向前掃瞄

3.如果該元素(已排序)大於新元素,將該元素移到下一位置

4.重複步驟3,直到找到已排序的元素小於或者等於新元素的位置

5.將新元素插入到該位置後

6.重複步驟2~5

如果比較操作的代價比交換操作大的話,可以採用二分查詢法來減少比較操作的數目。該演算法可以認為是插入排序的乙個變種,稱為二分查詢排序。

3.使用插入排序為一列數字進行排序的過程   

最差時間複雜度 o(n^)

最優時間複雜度 o(n)

平均時間複雜度o(n^)

4.c#實現

複製**

///

/// 插入排序

///

public class insertionsorter

list[j] = t;}}

}複製**陣列 

int iarrary = new int ;  

希爾排序

1.簡介

希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。希爾排序是非穩定排序演算法。

2.演算法實現

原始的演算法實現在最壞的情況下需要進行o(n2)的比較和交換。v. pratt的書[1] 對演算法進行了少量修改,可以使得效能提公升至o(n log2 n)。這比最好的比較演算法的o(n log n)要差一些。

希爾排序通過將比較的全部元素分為幾個區域來提公升插入排序的效能。這樣可以讓乙個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步長進行排序,演算法的最後一步就是普通的插入排序,但是到了這步,需排序的資料幾乎是已排好的了(此時插入排序較快)。

假設有乙個很小的資料在乙個已按公升序排好序的陣列的末端。如果用複雜度為o(n2)的排序(氣泡排序或插入排序),可能會進行n次的比較和交換才能將該資料移至正確位置。而希爾排序會用較大的步長移動資料,所以小資料只需進行少數比較和交換即可到正確位置。

乙個更好理解的希爾排序實現:將陣列列在乙個表中並對列排序(用插入排序)。重複這過程,不過每次用更長的列來進行。最後整個表就只有一列了。將陣列轉換至表是為了更好地理解這演算法,演算法本身僅僅對原陣列進行排序(通過增加索引的步長,例如是用i += step_size而不是i++)。

3.排序過程  

最差時間複雜度 根據步長序列的不同而不同。o(n\log^2 n)

最優時間複雜度 o(n)

平均時間複雜度  根據步長序列的不同而不同。

4.c#實現  

複製**

///

/// 希爾排序

///

public class shellsorter

list[j - 1] = t;}}

}}

複製**  

選擇排序

1.簡介

選擇排序(selection sort)是一種簡單直觀的排序演算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

選擇排序的主要優點與資料移動有關。如果某個元素位於正確的最終位置上,則它不會被移動。選擇排序每次交換一對元素,它們當中至少有乙個將被移到其最終位置上,因此對n個元素的表進行排序總共進行至多n-1次交換。在所有的完全依靠交換去移動元素的排序方法中,選擇排序屬於非常好的一種。

2.實現過程  

最差時間複雜度 о(n²)

最優時間複雜度 о(n²)

平均時間複雜度 о(n²)

3.c#實現

複製**

///

/// 選擇排序

///

public class selectionsorter

;private int min;

// private int m=0;

public void sort(int list)

int t = list[min];

list[min] = list[i];

list[i] = t;

// console.writeline("",list[i]);}}

}複製**

氣泡排序

1.簡介

氣泡排序(bubble sort,台灣譯為:泡沫排序或氣泡排序)是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。

氣泡排序對n個專案需要o(n^)的比較次數,且可以原地排序。儘管這個演算法是最簡單了解和實作的排序演算法之一,但它對於少數元素之外的數列排序是很沒有效率的。

氣泡排序是與插入排序擁有相等的執行時間,但是兩種法在需要的交換次數卻很大地不同。在最壞的情況,氣泡排序需要o(n^)次交換,而插入排序只要最多o(n)交換。氣泡排序的實現(類似下面)通常會對已經排序好的數列拙劣地執行(o(n^)),而插入排序在這個例子只需要o(n)個運算。因此很多現代的演算法教科書避免使用氣泡排序,而用插入排序取代之。氣泡排序如果能在內部迴圈第一次執行時,使用乙個旗標來表示有無需要交換的可能,也有可能把最好的複雜度降低到o(n)。在這個情況,在已經排序好的數列就無交換的需要。若在每次走訪數列時,把走訪順序和比較大小反過來,也可以稍微地改進效率。有時候稱為往返排序,因為演算法會從數列的一端到另一端之間穿梭往返。

2.演算法實現

1.比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。

2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。

3.針對所有的元素重複以上的步驟,除了最後乙個。

4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。 

3.實現過程  

最差時間複雜度 o(n^)

最優時間複雜度 o(n)

平均時間複雜度 o(n^)

4.c#實現

複製**

///

/// 氣泡排序

///

public class bubblesort

}if (!exchange) //本趟排序未發生交換,提前終止演算法 }}

}複製**

C 排序演算法小結

1 計數排序 如果給定上下界,並且區間不大的話,最適用。比如對於英文本母陣列進行排序。時間複雜度o n 空間複雜度o n void countsort int a,int n,int low,int high int ind 0 for int i 0 i size i 2 氣泡排序 基礎版 最基礎...

排序演算法小結 C 實現

include include 排序演算法的穩定性 對於相同的關鍵字,排序之前的位置和排序之後的位置相同,則稱為穩定排序,否則不穩定排序。歸併排序 基本思想為 先分解再合併,在合併的過程中進行排序 穩定排序 平均時間複雜度為 o nlogn 最好時間複雜度o nlogn 最好時間複雜度o nlogn...

排序演算法小結(C 實現)

前言 在這裡總結一下各種排序方式以增強理解和之後複習方便,附帶一些優化方式 目錄 非線性時間 1.比較 1氣泡排序 2快速排序 2.插入 1插入排序 2希爾排序 3.選擇 1選擇排序 2堆排序 4.歸併 1二路歸併 2多路歸併 線性o n 1.計數排序 2.堆排序 3.基數排序 正文 1.簡單氣泡排...