c 實現幾種排序方法

2022-03-04 19:43:22 字數 3815 閱讀 2611

1.簡介

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

2.演算法描述

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

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

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

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

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

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

6.重複步驟2~5

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

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

最差時間複雜度

最優時間複雜度

平均時間複雜度

4.c#實現

///

/// 插入排序

///

public class insertionsorter

list[j] = t;}}

}希爾排序

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)

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

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.實現過程

最差時間複雜度

最優時間複雜度

平均時間複雜度

4.c#實現

///

/// 氣泡排序

///

public class bubblesort

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

}

C 實現幾種排序

寫幾個常用的排序 1 氣泡排序 2 選擇排序 3 插入排序 4 歸併排序 5 快速排序 6 希爾排序 具體實現 氣泡排序 i start end 1 每一次兩兩比較array i 與array i 1 大的上浮,小下沉 比較次數 於如果array 0 是最大值,則需要size 1次才能放到正確的位置...

c語言幾種排序方法

1.將輸入的一串數字存入陣列中,可先用字串的形式輸入,再通過轉化成整型數存入陣列中 int len 0,tmp 0 int a maxsize char string 100 printf 請輸入任意個數的整數,以回車結束 n gets string char str string while st...

C 實現幾種排序演算法

概念 氣泡排序的大概思想是兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序為止 1.普通冒泡法 void bubblesort vector vi 2.優化冒泡法,增加標誌位,對已經有序的序列不在進行比較 void bubblesort2 vector vi 概念 通過n i次關鍵字間的比較,...