C 實現七種經典排序演算法

2021-09-17 04:12:33 字數 3522 閱讀 7779

具體的排序方法如下所示:

(1)氣泡排序

基本思想:比較相鄰的兩個數,如果前者比後者大,則進行交換。每一輪排序結束,選出乙個未排序中最大的數放到陣列後面。常見氣泡排序演算法如下所示:

void bubblesort(int *arr,int n)

} }

公升級版氣泡排序法:通過從低到高選出最大的數放到後面,再從高到低選出最小的數放到前面,如此反覆,直到左邊界和右邊界重合。當陣列中有已排序好的數時,這種排序比傳統氣泡排序效能稍好。

void superbubblesort(int *arr,int n)

} right--;

for (int j = right; j >left; j--)

}left++;

}}

(2)快速排序基本思想:選取乙個基準元素,通常為陣列最後乙個元素(或者第乙個元素)。從前向後遍歷陣列,當遇到小於基準元素的元素時,把它和左邊第乙個大於基準元素的元素進行交換,即從前往後找小的,從後往前找大的。利用分治策略從已經分好的兩組中分別進行以上步驟,直到排序完成。

//把值進行交換

void swap(int *x,int *y)

//把陣列分成兩部分

int partition(int *a,int left ,int right)

//把基準元素放到中間

swap(&a[right], &a[++i]);

//返回陣列中間的位置

return i;

}//快速排序的函式

void quicksort(int *a,int left ,int right)

(3)直接插入排序基本思想:和交換排序不同的是它不用進行交換操作,而是用乙個臨時變數儲存當前值。當前面的元素比後面大時,先把後面的元素存入臨時變數,前面元素的值放到後面元素位置,再到最後把其值插入到合適的陣列位置。所以相應的輔助空間為o(1)。

void insertsort(int *a ,int n)  //直接插入排序

}void shellinsertsort(int *a ,int n,int dk)

a[j+dk] = tmp;

} }}

(5)直接選擇排序基本思想:依次選出陣列最小的數放到陣列的前面。首先從陣列的第二個元素開始往後遍歷,找出最小的數放到第乙個位置。再從剩下陣列中找出最小的數放到第二個位置。以此類推,直到陣列有序。

void selectsort(int *a ,int n)

}//  建立大堆頂,i為當前節點,n為堆的大小

// 從第乙個非葉子結點i從下至上,從右至左調整結構

// 從兩個兒子節點中選出較大的來與父親節點進行比較

// 如果兒子節點比父親節點大,則進行交換

void creatheap(int *a,int i,int n)

else

j=left;

if(a[j] >a[i])}}

(7)歸併排序基本思想:歸併演算法應用到分治策略,簡單說就是把乙個大的問題分解成易於解決的小問題後乙個個解決,最後在把小問題的一步步合併成總問題的解。這裡的排序應用遞迴來把陣列分解成乙個個小陣列,直到小陣列的數有序,再把有序的小陣列兩兩合併而成有序的大陣列。

void mergesort(int *a ,int left ,int right)

//合併兩個已經排好序的陣列

void merge (int *a ,int left, int mid ,int right)

while(i<= mid)

while(j<=right)

for (int k = 0; k < len; k++)

}

執行,對相應的函式建立標頭檔案,在主函式進行呼叫,主函式**如下:

#include #include "bubblesort.h"

#include "quicksort.h"

#include "insertsort.h"

#include "selectsort.h"

#include "mergesort.h"

using namespace std;

void main()

; int n = sizeof(arr) / sizeof(arr[0]);

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

cout<

cout<

bubblesort(arr, n);

/* 最差時間複雜度為o(n^2);

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

穩定性:穩定;

輔助空間o(1)

*/ superbubblesort(arr,n);

/* 這種排序比傳統氣泡排序效能稍好

*/ quicksort(arr,0,n-1);

/* 最差時間複雜度:o(n^2);

最優時間複雜度:o(nlogn);

平均時間複雜度:o(nlogn);

穩定性:不穩定的;

輔助空間:o(nlogn)

*/ insertsort(arr,n);

/* 最差時間複雜度:o(n^2);

最優時間複雜度:o(n);

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

穩定性:穩定;

輔助空間:o(1)

*/ shellsort(arr,n);

/* 最差時間複雜度:o(n^2);

最優時間複雜度:o(n);

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

穩定性:不穩定的;

輔助空間:o(1)

*/ selectsort(arr,n);

/* 最差時間複雜度:o(n^2);

最優時間複雜度:o(n^2);

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

穩定性:不穩定的;

輔助空間:o(1)

*/ heapsort(arr,n);

/* 最差時間複雜度:o(nlogn);

最優時間複雜度:o(nlogn);

平均時間複雜度:o(nlogn);

穩定性:不穩定的;

輔助空間:o(1)

*/ mergesort(arr,0,n-1);

/* 最差時間複雜度:o(nlogn);

最優時間複雜度:o(nlogn);

平均時間複雜度:o(nlogn);

穩定性:不穩定的;

輔助空間:o(n)

*/ for(int i = 0; i < n ; i++)

cout<

cout<

}

七種常見經典排序演算法總結 C

最近想複習下c 很久沒怎麼用了,畢業時的一些經典排序演算法也忘差不多了,所以剛好一起再學習一遍。除了冒泡 插入 選擇這幾個複雜度o n 2 的基本排序演算法,希爾 歸併 快速 堆排序,多多少少還有些晦澀難懂,幸好又大神dreamcatcher cx都總結成了 一步步很詳細,十分感謝。而且就時間複雜度...

七種排序演算法

排序方法 平均情況 最好情況 最壞情況 輔助空間 穩定性插入排序 o n 2 o n o n 2 o 1 穩定希爾排序 o n log n o n 2 o n 1.3 o n 2 o 1 不穩定選擇排序 o n 2 o n 2 o n 2 o 1 不穩定氣泡排序 o n 2 o n o n 2 o ...

C語言實現七種排序演算法

1 冒泡法 冒泡法大家都較熟悉。其原理為從a 0 開始,依次將其和後面的元素比較,若a 0 a i 則交換它們,一直比較到a n 同理對a 1 a 2 a n 1 處理,即完成排序。下面列出其 冒泡法原理簡單,但其缺點是交換次數多,效率低。下面介紹一種源自冒泡法但更有效率的方法 選擇法 2 選擇法 ...