語法是語言的特色,而演算法卻是靈魂
演算法不分語言
入門的演算法要數排序演算法
今天的演算法講解將以c語言為例子將以下幾個排序演算法
1. 桶排序
2. 插入排序
3. 氣泡排序
4. 快速排序
首先給大家介紹乙個最簡單粗暴的排序演算法
桶排序要先知道要排序的數的範圍
然後要這麼多的桶去裝這些可能出現數的次數
//這裡的範圍是0~999
int b[1000];
這個陣列就是用來裝出現次數的
然後輸入數字,然後這個相應的桶的次數就加1
輸出時遍歷全部桶,然後桶的數字是幾就輸出幾次這個數字
**如下
#include
int main();
int i,j;
for(i=0;i<10;i++)
for(i=0;i<1000;i++)
return
0;}
這方法夠簡單夠粗暴吧
其實這方法還可以優化一下
我們雖然是知道範圍,但輸入的數的範圍可能要比給出的範圍少得多,這樣的話遍歷全部桶就很浪費時間了
所以我們可以找到輸入數字的最大值和最小值,只需遍歷最大值和最小值之間的桶就行了,因為其他桶都是0,不用輸出
所以**就可以改為
#includeint main();
intmax=0;
intmin=1000;
int i,j;
for(i=0;i<10;i++)
if(num
}//遍歷最大值和最小值之間的桶
for(i=min;i<=max;i++)
return
0;}
桶的編碼對應的是它記錄的數字
然後有人就問如果有負數怎麼辦
負數的話,把全部桶平移一下就好,輸出時把桶的編碼再減去平移值
比如範圍是-10~9
可以開個陣列int b[20];
輸入的話就是b[num+10]++
輸出的話printf(「%d 「,i-10);
這個演算法大概就是這樣了,雖然說是簡單,但是我們通常情況下是不知道確切的範圍的,如果以最大範圍去開闢桶就會很浪費空間
然後接下來講第二種演算法
插入排序的基本思想是,從第二個數開始,插入到前面有序序列的位置
比如說3個數,分別是5,4,2
然後從第二個數開始
4比5小,應該插到5的前面
然後5後退一位
現在的序列程式設計4,5,2
然後到第三個數2
2應該插到4前面
所以4和5都要後退一位
現在就變成2,4,5的有序序列了
具體**是這樣
#include
int main()
for(i=1;i<10;i++)
/ 到位置後放置
a[n+1]=temp;
} for(i=0;i<10;i++)
return ;
}
第二個for迴圈i=1就是從第二個數開始
可能需要大家一點抽象思維去想象
比如排隊
是按號排隊的
他遲到了
然後他就拿這號從最後一位一直向前問
後面的都比他大,終於找到乙個比他小的
他不可能排他前面,所以只能排他後面
然後他就插隊進去了
他後面的人都被他擠後了一位
接下來介紹另一種排序演算法
氣泡排序的思想是,每次把最小的數冒到左邊
就像氣泡一樣越接近水面的泡泡越大
繼續是以剛剛的數列5,4,2為例
從第乙個數開始
5比4大,然後就交換
4比2大然後就交換
然後現在的序列是2,5,4
然後到第二個數開始
5比4大,交換位置
然後這個序列就排好了
具體**如下
#include
int main()
for(i=0;i<9;i++)}}
for(i=0;i<10;i++)
return
0;}
這種排序方法是初學者必須掌握的一種排序方法
最後講一種高階一點的演算法
掌握這種方法可以說是初學者的分水嶺
這種排序方法包含了遞迴和分治的思想
遞迴我們最熟悉的就是猴子吃桃
最後一天剩乙個,每天吃總數的一半,吃了五天,然後問你最開始有多少個桃子
然後就是從最後一天開始算,一直算到第一天
分治就是,講乙個問題分開處理
但分開處理是沒有影響的
就比如掃地
可以掃地分為掃客廳和掃房間
快速排序的思想是從給乙個陣列,然後在陣列中找乙個基準值
兩邊派乙個士兵去幫我找數
要從右邊的士兵開始
右邊的士兵要找乙個比基準值小的數
找到後停下來等左邊的士兵
左邊的士兵要找乙個比基準值大的數
找到後就停下來,交換這兩個數的位置
交換後繼續找,直到他們相遇
相遇時這個數一定比基準值小
大家直到為啥嗎
我們有乙個很關鍵的一步
從右邊開始
右邊停下的位置一定是小於基準值的
相遇後相遇的數和基準值交換,我們這裡取最左邊的數為基準值
交換之後,基準值的左邊都是比基準值小的,基準值右邊都是比基準值大的
然後就按相同的規則排基準值的左邊和右邊
排序時不僅要傳入陣列,還要傳入範圍
一旦排到左邊界等於右邊了就不用排了,就可以return返回了
**如下
#include
int main()
quicksort(a,0,9);
for(i=0;i<10;i++)
return
0;}
void quicksort(int a,int left,int right)
int low=left;
int high=right;
//這個基準值可以隨便取,只要在left和right範圍內就好
int key=a[left];
while(low!=high)
//左邊小於基準值就跳過
while(lowif(lowint temp=a[low];
a[low]=a[high];
a[high]=temp;}}
//退出迴圈時low=high
a[left]=a[low];
a[low]=key;
quicksort(a,left,low-1);//繼續處理左邊的,這裡是乙個遞迴的過程
quicksort(a,low+1,right);//繼續處理右邊的 ,這裡是乙個遞迴的過程
}
如果大家理解了這種演算法,對c語言的造詣就會深一層
這篇關於快速排序部落格有配圖更加形象
這裡講的都是從小到大的排序,大家可以思考一下用這幾種演算法如何從大到小排序
基本排序演算法c
氣泡排序 基本思想 兩兩比較待排序的數,發現反序時交換,直到沒有反序為止。public static void bubblesort int r if noswap 快速排序 基本思想 在待排序數列中任選出乙個數作為基準,用這個基準將數列劃分為左右兩個子區,使得左子區的數都不大於基準數,而右子區的數...
C日記 快速排序
快速排序一直是c的常用演算法 總得來說就是一段話 以第乙個數為基數兩邊靠中間收縮比較,左邊收縮過程中比基數小就跳過,右邊收縮過程中比基數大就跳過,停止後交換左右停止位置的數,若兩邊收縮還沒碰頭繼續收縮。碰頭後將該位給左邊第乙個,將該基數給該位,完成第一輪交換。然後在用該函式分別將基數左右排序,然後直...
c語言學習日記 排序演算法篇
1.快速排序 排序原理 快速排順是對氣泡排序改進,首先這頂乙個值,通過該值將 陣列分為2個部分,小於基準數的放到左邊,大於基準數的放到右邊。之後左右兩邊的資料分別進行排序,而左右兩邊的排序依舊可以採用設定乙個值兩邊排序,這是乙個遞迴的思想。演算法實現 public static void quick...