排序演算法總結及實現(C語言版)

2021-07-28 22:21:16 字數 3010 閱讀 6310

#include #include using namespace std;

void swap(int &a, int &b)

/*1、選擇排序

基本思想:首先,選出最小的數放在第一位,然後選擇第二小的數,放在第二位;以此類推,直到所有的數從小到大排列.

那麼,對於大小為n的陣列需要n-1輪選擇過程。第i輪選取第i小的數,請將其放在第i個位置上。

不穩定

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

最好情況o(n^2)

最壞情況o(n^2)

空間複雜度o(1)

*/void select_sort(int a, int n)

if(i != min_index) }}

/*2、氣泡排序

基本思想: 不斷比較相鄰的兩個數,讓較大的數不斷地往後移。經過一番比較,就選出了最大的數。經過第二輪比較,就選出了次大的數。以此類推。

那麼對於大小為n的陣列,需要n-1輪比較。

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

最好情況o(n)

最壞情況o(n^2)

空間複雜度o(1)

*/void bubble_sort(int a,int n)

} if(is_sorted)//如果沒有發生交換,說明已經排好序了,提前退出迴圈,所以最好情況下時間複雜度為o(n)

break; }}

/*3、快速排序

基本思想:採用分而治之的思想,將要排序的數分成左右兩部分,其中一部分的資料比key小,另一部分資料比key大。然後將所分得的兩部分資料進行同樣的劃分。重複執行以上的劃分操作。

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

最好情況o(nlog2(n))

最壞情況o(n^2)

空間複雜度o(nlog2(n))

*/int partition(int arr, int low, int high)//返回劃分的中間值

if(low < high)

arr[low ++] = arr[high];//找到合適的資料填到了low坑,但是形成了high坑,繼續找合適的資料

while( low < high && arr[low] <= key)

low ++;

if( low < high)

arr[high --] = arr[low];//low又成了坑

} arr[low] = key;//將key填到這個坑

return low;

}void quick_sort(int num, int low, int high)

}/*快速排序非遞迴版*/

void quicksort2(int num, int low, int high)

if(pos+1 < high)

while(!s.empty())

if(pos + 1 < r)

} }}/*

4、插入排序

基本思想:將元素逐個新增到已經排好序的陣列中去。

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

最好時間複雜度o(n)

最壞時間複雜度o(n^2)

空間複雜度o(1)

*/void insert_sort(int a, int n)

//如果找到合適位置i應該!=j,如果i==j,說明i正好在正確的位置

if( i != j) }}

/*5、希爾排序

基本思想:將無序陣列分成若干個子串行,子串行不是逐段分割的,而是相隔特定增量。對各個子串行進行插入排序。

然後再選擇乙個更小的增量,再將陣列分割成多個子串行進行排序。最後選擇增量為1,即使用直接插入排序,使最終陣列成為有序陣列。

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

最好時間複雜度o(n)

最壞時間複雜度o(n^2)

空間複雜度o(1)

*/void shell_sort(int a, int n)

} }}/*

6、歸併排序:

基本思想:將待排序序列【0,n-1】看成是n個長度為1的有序序列,將相鄰的有序表成對歸併,得到n/2個長度為2的有序表。再次歸併,得到n/4個長度為4的有序表。

依次類推,最後得到長度為n的1個有序表。

所以歸併排序其實要做兩件事:

1、先遞迴的分解數列,

2、再合併數列就完成了歸併排序。

先來考慮如何合併?

每次合併過程中都要對兩個有序的序列段進行合併,然後排序

待合併的兩個有序序列段分別為 r[low, mid] 和 r[mid+1, high]

先將它們合併到乙個暫存陣列r2,合併完再將r2複製回r1中。

這樣一次合併排序就完成了。

最好、最壞和平均時間複雜度都是o(nlogn),

空間複雜度是o(n)

*/void merge(int a, int low ,int mid, int high,int tmp)

while( i <= mid)

tmp[k++] = a[i++];

while( j <= high)

tmp[k++] = a[i++];

//最後再複製回a

for(i = 0; i < k; i++ )

a[low+i] = tmp[i];//!!!!此處a是從low開始,tmp是從0開始。

}void merge_sort(int a,int low, int high, int tmp)

}bool sort(int a, int n)

/*堆排序

*/int main()

; //select_sort(num, 7);

//bubble_sort(num,7);

//quick_sort(num,0,6);

quicksort2(num, 0, 6);

//insert_sort(num,7);

//shell_sort(num,7);

//sort(num,7);

for(int i = 0; i < 7; i++)

return 0;

}

排序演算法彙總 C語言版

首先在未排序序列中找到最小 大 元素,存放到排序序列的起始位置,再從剩餘未排序元素中繼續尋找最小 大 元素,然後放到已排序序列的末尾,重複操作。演算法分析 第一輪比較是陣列中的第乙個元素與其他的元素一 一對比,只要找到比它小的,它兩就交換順序,所以第乙個相對於已經進行比較過的元素而言是最小的,繼續比...

Sunday演算法c語言版實現

一 bf演算法 bf演算法是普通的模式匹配演算法,其基本思想就是將目標串的第乙個字元與模式串的第乙個字元進行匹配。若相等,則繼續比較第二個字元 若不相等,則比較目標串的第二個字元和模式串的第乙個字元。依次比較下去,直到得出最後的匹配結果。示例 static int bf const char src...

排序演算法基本齊全(C語言版)

直接給出當初大一下學期學演算法與資料結構課的程式吧,把很多排序演算法都寫了 有序集和無序集相鄰,摘取無序集首元素插入有序集 多佇列同時以增量為步長實施直接插入,當步長為1,調整後停止 將待排序元素分作有序集和無序集,持續從無序集中選出極值放入有序集特定位置,直至無序集為空 反覆掃瞄 return i...