C日記 基本的排序演算法

2021-07-16 06:45:52 字數 3893 閱讀 3800

語法是語言的特色,而演算法卻是靈魂

演算法不分語言

入門的演算法要數排序演算法

今天的演算法講解將以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...