經典排序演算法總結(C語言)

2021-08-21 18:33:30 字數 2798 閱讀 4236

十種常見排序演算法一般分為以下幾種: 

(1)非線性時間比較類排序:交換類排序(快速排序和氣泡排序)、插入類排序(簡單插入排序和希爾排序)、選擇類排序(簡單選擇排序和堆排序)、歸併排序(二路歸併排序和多路歸併排序);

(2)線性時間非比較類排序:計數排序、基數排序和桶排序。

總結: 

(1)在比較類排序中,歸併排序號稱最快,其次是快速排序和堆排序,兩者不相伯仲,但是有一點需要注意,資料初始排序狀態對堆排序不會產生太大的影響,而快速排序卻恰恰相反。

(2)線性時間非比較類排序一般要優於非線性時間比較類排序,但前者對待排序元素的要求較為嚴格,比如計數排序要求待排序數的最大值不能太大,桶排序要求元素按照hash分桶後桶內元素的數量要均勻。線性時間非比較類排序的典型特點是以空間換時間。

注:本博文的示例**均已遞增排序為目的。

#include #include #include //動態演示排序

//交換函式 方便下面排序函式的使用

void swap(int *a,int *b)

/* ******氣泡排序******

1,比較兩個數的大小

2,交換兩個數的位置

最好情況:順序o(n)

最壞情況:逆序o(n*n)

****************

*/void bubble_sort(int *a , int n)

} //相鄰的元素如果都有順序 不用進行迴圈了

if(flag == false)

}}/*

******選擇排序******

每次找到最大的下標 然後放在最後面

****************

*/void select_sort(int arr,int n)

} //將找到的最大元素交換到本趟排序數的最後面

if(maxindex != n-i)

}}/*

******插入排序******

迴圈移動 直到 arr[j] >= num

放到 j+1

如果沒有移動 不需要改變

最好情況:順序o(n)

最壞情況:逆序o(n*n)

****************

*/void insert_sort(int arr, int n)

// arr[j] = num;

for(j = i-1; j >= 0; j--)

else//如果 arr[j] >= num 插入到 j+1

}//如果不相等證明 移動了 否則 沒有移動(證明不需要移動)也就不需要改變

if(j != i-1)

}}void binaryinsert_sort(int arr, int len)

else

}for(int j = i -1; j >= left; j--)

arr[left] = num; }}

/* ******雞尾酒排序******

相當於選擇排序

同時找到最小與最大的元素

節省時間

*****************

*/void cocktailsort(int arr,int n )

if(arr[j] < arr[min])

}if(max != n-i)

//如果要交換位置是最後位置 然而最後位置的值剛才已經改變

if(min == n -i) //本來儲存的值已經到了 arr[max]的位置

else if(min != i -1 )

}}/*

******歸併排序******

歸併排序(merge-sort)是利用歸併的思想實現的排序方法,

該演算法採用經典的分治(divide-and-conquer) 策略

(分治法將問題分(divide)成一些小的問題然後遞迴求解,

而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,

即分而治之)。

****************

*/int* merge(int arr,int len1,int brr,int len2)

else

}while(ikey;j--);

if(j > i)

for(; i i)

}arr[i] = key;

if(i -1> left)

if(i+1 < right) }

//快速排序是不穩定的

void quick_sort(int arr,int len)

/* ***********桶排序***********

按照大小把這些資料分到不同的桶裡

再對這些桶進行分別排序

考慮他的疏密情況

*/void show(int *a,int n)

printf("\n");

}int main()

; int a[5] = ;

int b[6] = ;

int *p;

p = merge(a,5,b,6);

show(p,11);

printf("\n");

//cocktailsort(arr,10);

//maopaosort(arr,10);

quick_sort(arr,10);

//insertsort(arr,10);

show(arr,10);

int x =1,y=2;

swap(&x,&y);

printf("%d %d\n",x,y);

printf("\n");

return 0;

}

總結 經典排序演算法 C )

最近在學習演算法,趁這個機會總結一些演算法。慢慢更新,歡迎交流 排序 輸入 n個數 輸出 有序 從大到小 從小到大 序列 一 插入排序 做排序的都需要做遍歷,而插入排序,顧名思義,就是插隊。不必多說,給個案例體會一下 輸入 5 4 3 2 1 處理 輸出 1 2 3 4 5 輸入 6 8 2 4 5...

經典排序演算法總結

排序演算法是離散數學和資料結構學科最基本的演算法,雖然知道這些排序演算法的名字,但是一直沒有研究過它們的實現原理。現在把它們收集起來,並一一親自實現,來加深對排序演算法的理解。1,氣泡排序 最簡單的排序演算法,從第乙個元素開始比較相鄰元素大小,如果前邊元素大於後邊元素則交換位置,否則將下標移到下乙個...

經典排序演算法總結

插入排序 選擇排序 歸併排序 排序方法 平均情況 最好最差 空間複雜度 穩定性氣泡排序o n2 o n 2 o n o n o n2 o n 2 o 1 o 1 穩定快速排序o nlogn o nlog n o nlogn o nlog n o n2 o n 2 o nlogn o nlog n 不...