// 交換函式
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方法來表示。在後面我將 給出詳細的說明。對於排序的演算法我想先做一點簡單的介紹,也是給這篇文章理乙個提綱。我將按照演算法的複雜度...