各種排序演算法

2021-05-28 17:03:52 字數 2596 閱讀 8964

// 交換函式

void

swap

(int

*a,int

*b)// 氣泡排序

/* 氣泡排序(bubble sort,台灣譯為:泡沫排序或氣泡排序)是一種簡單的排序演算法。

它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。

走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。

這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。

氣泡排序對n個專案需要o(n2)的比較次數,且可以原地排序。儘管這個演算法是

最簡單了解和實作的排序演算法之一,但它對於少數元素之外的數列排序是很沒有效率的。

氣泡排序是與插入排序擁有相等的執行時間,但是兩種法在需要的交換次數卻很大地不同。

在最壞的情況,氣泡排序需要o(n2)次交換,而插入排序只要最多o(n)交換。

天真的氣泡排序實作(類似下面)通常會對已經排序好的數列拙劣地執行(o(n2)),

而插入排序在這個例子只需要o(n)個運算。因此很多現代的演算法教科書避免使用氣泡排序,

而用插入排序取代之。氣泡排序如果能在內部迴圈第一次執行時,使用乙個旗標來表示有

無需要交換的可能,也有可能把最好的複雜度降低到o(n)。在這個情況,在已經排序號的

數列就無交換的需要。若在每次走訪數列時,把走訪順序和比較大小反過來,也可以些微

地改進效率。有時候稱為往返排序(en:shuttle sort),因為演算法會從數列的一端到另一

端之間穿梭往返。

氣泡排序演算法的運作如下:

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

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

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

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

由於它的簡潔,氣泡排序通常被用來對於程式設計入門的學生介紹演算法的概念。

*/void bubble_sort(

int*arr,

int len)}}

}/* 雞尾酒排序,也就是定向氣泡排序, 雞尾酒攪拌排序, 攪拌排序 (也可以視作選擇排序的一種變形),

漣漪排序, 來回排序 or 快樂小時排序, 是氣泡排序的一種變形。此演算法與氣泡排序的不同處在於排序

時是以雙向在序列中進行排序。

*/void cocktail_sort(

int*arr,

int len)

}bottom --;

for(

int i = top; i < bottom; i ++)

}top ++;

}}void even_odd_sort(

int* arr,

int len)

for(

int j = 0; j < i; j +

= 2)}}

// 快速排序

void quick_sort(

int* arr,

int beg,

int end)

if(arr[k]

< piv)

// 如果剩下的那個數比標記小,則交換,這樣就是這個數前面的都比它小,後面的都比它大,所以這個數就不用再排了。

else

// 如果剩下這個數大於或等於標記的數,那麼將這個數的前乙個與這個數交換,並對之前的和之後的分別排序。}}

// 選擇排序

void select_sort(

int*arr,

int len)}}

// 堆排序

static

void build_heap(

int*arr,

int start,

int end)

if(arr[child]

< tmp)

else

}arr[parent]

= tmp;

}void heap_sort(

int* arr,

int len)

}// 插入排序

void insert_sort(

int* arr,

int len)

}arr[j]

= tmp;}}

// 希爾排序

void shell_sort(

int* arr,

int len)

arr[j + step]

= tmp;

}step >

>

= 1;}}

// 歸併排序

static

void

merge

(int

* arr,

int start,

int mid,

int end)

while

(i < len1)

while

(j < len2)

free

(sa1);}

void merge_sort(

int* arr,

int start,

int end)

}

排序 各種排序演算法

每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子表中適當位置,直到全部記錄插入完成為止 待排序的記錄放在陣列r 0,n 1 中 排序過程中將r分成兩個子區間,有序區r 0,i 1 無序區r i,n 1 將當前無序區的第1個記錄,插入到有序區中適當的位置上 每次是有序區增加乙個記錄,知道...

各種排序演算法

include include include using namespace std void swap int a,int b void output int a,int n 直接插入排序 時間複雜度o n 2 void insertsort int a,int n 折半插入排序 o n 2 只...

各種排序演算法

排序演算法是一種基本並且常用的演算法。由於實際工作中處理的數量巨大,所以排序演算法 對演算法本身的速度要求很高。而一般我們所謂的演算法的效能主要是指演算法的複雜度,一般用o方法來表示。在後面我將 給出詳細的說明。對於排序的演算法我想先做一點簡單的介紹,也是給這篇文章理乙個提綱。我將按照演算法的複雜度...