新博客開張,就拿排序算法開張吧。。。我盡量從最簡單的排序算法開始,不定期連載更新中~
ps:在我學會JAVA和C++之前,程序都用C來寫吧,水平有限,大家湊和著看吧 重點是算法!~
(圖片來源於網絡)
目錄:
1.插入排序——直接插入排序。
2.插入排序——希爾排序。
3.選擇排序——簡單選擇排序。
4.選擇排序——堆排序。
5.交換排序——冒泡排序。
6.交換排序——快速排序(大力推薦使用)。
7.歸並排序。
8.基數排序。
1.插入排序——直接插入排序。
具體算法描述如下:(個人認為很好理解)
ps:可以采用二分查找法來減少比較操作的數目,稱為二分查找插入排序法。
C語言代碼如下:
ps:修改:輸入時以一個空格隔開
2.插入排序——希爾排序(相對於直接插入排序,效率進一步提高)。
希爾排序(Shell Sort)是插入排序的一種。是針對直接插入排序算法的改進。該方法又稱縮小增量排序,因DL.Shell於1959年提出而得名。 希爾排序(漸減增量排序法)思想:1959年Donald L. Shell提出Shell排序法 ,源自對直接插入算法的改進.具體算法描述如下:
先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量為1)時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比前兩種方法有較大提高。
C語言代碼如下:
3.選擇排序——簡單選擇排序。
又到了一種簡單易理解的算法 0.0
原理如下(摘自百度百科):
設所排序序列的記錄個數為n。i取1,2,…,n-1,從所有n-i+1個記錄(Ri,Ri+1,…,Rn)中找出排序碼最小的記錄,與第i個記錄交換。執行n-1趟 後就完成了記錄序列的排序。
C語言代碼如下:
4.選擇排序——堆排序。
待補充...
5.交換排序——冒泡排序。
這個算法的名字由來是因為越大的元素會經由交換慢慢“浮”到數列的頂端,故名。 由於冒泡排序簡潔的特點,它通常被用來對於計算機程序設計入門的學生介紹算法的概念。 冒泡排序算法的運作如下:(來自百度百科)C語言代碼如下:
6.交換排序——快速排序(大力推薦使用)。
終於寫到了我最喜歡的快速排序算法。
原理介紹如下:(摘自百度百科)
快速排序(Quicksort)是對冒泡排序的一種改進。由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。 1 #include<stdio.h>
2 #define MAXN 10000
3
4 void QuickSort(int a[],int numsize)
5 {
6 int i=0,j=numsize-1;
7 int key=a[0];
8 if(numsize>1) //確保數組長度至少為2,否則無需排序
9 {
10 while(i<j) //循環結束條件
11 {
12 for(;j>i;j--)
13 if(a[j]<key)
14 {
15 a[i++]=a[j];
16 break;
17 }
18 for(;i<j;i++)
19 if(a[i]>key)
20 {
21 a[j--]=a[i];
22 break;
23 }
24 }
25 a[i]=key;
26 QuickSort(a,i); //遞歸
27 QuickSort(a+i+1,numsize-i-1); //遞歸
28 }
29 }
30
31 int main()
32 {
33 printf("請輸入一組數,每個數之間以1個空格隔開,Enter鍵結束輸入\n");
34 int arr[MAXN]; //定義一個足夠大的數組
35 int i=0,j,k,count = 0;
36 while(count<MAXN) //讀入數組,存入數組a中;
37 {
38 scanf("%d",&arr[i++]);
39 count++;
40 if(getchar() == '\n') break;
41 }
42 QuickSort(arr,count);
43 for(i=0;i<count;i++)
44 printf("%d ",arr[i]);
45 return 0;
46 }
<--點擊左側+展開
7.歸並排序。
待補充...
8.基數排序。
待補充...