如此簡單的冒泡排序,我居然不知道這個原理?

引言

算法,是大多數小白的噩夢。它時常讓衆多小白們琢磨不透。對於初學者來說,即使是最基礎的算法,也要轉很久的彎才能繞過來,但是過了幾天,又遺忘得差不多。當老師佈置一道算法題的時候……
甲:今天怎麼又要寫算法了?
乙:這什麼破題!碼字10分鐘,調試一小時。
丙:大神救我!算法題鯊我!!!
丁:真是一竅不通,選錯專業了嗚嗚嗚。
在這裏插入圖片描述
但是,無論算法有多麼難,都要保持着一顆真誠的心。
算法虐我千百遍,我待算法如初戀。
在做算法題的時候,你的表情應該是這樣子的。
在這裏插入圖片描述
在跟同學一起交流學習的時候,是不是經常發現,自己好不容易研究出一道算法題跟同學分享後,瞬間逼格滿滿。
當同學們看到你的運行結果後……
在這裏插入圖片描述
但是,做出一道算法題並不說明你很厲害。
殊不知,這纔是身經百戰的算法大佬!
在這裏插入圖片描述
咳咳咳,廢話說多了,言歸正傳,現在教教大家如何實現數組排序!這種算法是展現逼格的第一層內功!

一、實現原理詳解

原理暫時先不多說,一張 gif 圖先乾爲敬!看看能不能理解!
在這裏插入圖片描述
大家看出來了嗎?
比如說有一組數組20 10 15 30 12
我們要把它從小到大排列,如果拋開代碼實現的話,怎麼排序?大家可以在紙上手寫感受一下!
步驟如下:
(1)第一輪比較
①20 和 10 比較,即第一個和第二個比較,顯然第二個更小,我們就把10放在前面,20放在後面。
這樣原來的數組就變成 10 20 15 30 12
②20 和 15 比較,即第二個和第三個比較,顯然15更小,把15放在20前面。
這樣原來的數組就變成 10 15 20 30 12
③20 和 30 比較,即第三個和第四個比較,顯然20更小,20位置就不用變了。
這樣數組還是 10 15 20 30 12
④30 和 12 比較,即第四個和第12個比較,顯然12更小,把12放在30前面。
這樣數組變爲 10 15 20 12 30

看到沒,步驟①到步驟④遍歷了所有的數,每次都把相鄰的數進行比較和交換。這是第一輪比較!

(2)第二輪比較:重複第一輪比較的步驟
最終所得數組爲 10 15 12 20 30
仔細看看,嗯,還是沒完成從小到大排列,繼續繼續!
(3)第三輪比較:重複第一輪比較的步驟
最終所得數組爲 10 12 15 20 30
哈哈哈,發現了沒,它現在已經是從小到大排列了!

二、代碼實現詳解

接下來,裝逼的時刻到了,我們要把冒泡排序算法用C語言代碼來實現!
在這裏插入圖片描述
不懂的同伴,可以一邊看講解,一邊對應代碼。
冒泡排序代碼詳解:第⑤步是冒泡排序的關鍵。源碼下滑可得
①main()函數進入程序,首先是聲明i,j,t,這三個變量剛開始看的時候可能沒看懂,先跳過
②又聲明瞭一個數組a,長度爲10
③關鍵來了,srand()函數是啥東西?它存在於<stdlib.h>頭文件中,定義爲void srand(unsigned int seed),在本程序中seed對應time(0),用來初始化隨機數發生器,簡單地來說,在進行任何取隨機數操作之前,都要有**srand()**函數的調用。
④分別給數組中的每個數賦予隨機值並打印,隨機值的範圍在60~100之間
60~100在代碼中要寫成60+40*rand()/RAND_MAX

for(i=0;i<10;i++){
		a[i]=(int)(60+40*rand()/RAND_MAX);
		printf("%5d",a[i]);
	}

⑤第五步是是冒泡排序的核心
我不知道大家是否能看懂這段代碼,但是實現冒泡排序的排序過程,確實只要這一段代碼足以。
for(i=0;i<9;i++):
for(j=0;j<9-i;j++)
冒泡排序的實現要用兩個for的嵌套循環
比如有一個長度爲10數組,要進行9輪的排序,每輪都遍歷所有數,這是 i<9 的含義;
細心的朋友會發現,每進行一輪排序之後,下一輪排序的次數就減少了一次,這是就是 j<9-i 的由來
在長度爲10的數組中,第一輪排序排列 9 次,第二輪排序就排8次,依次類推,第9輪排序只排一次
在冒泡排序中,一個數組排序的輪數永遠是
其長度的值減去1

if(a[j]>a[j+1]){
int t;
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}

相鄰兩個數,若前一個數大於後一個數,則兩個數的值進行置換!

⑥輸出冒泡排序後的數組


for(i=0;i<9;i++)
		for(j=0;j<9-i;j++)
		if(a[j]>a[j+1]){
			int t;
			t=a[j];
			a[j]=a[j+1];
			a[j+1]=t;
		}

三、冒泡排序完整代碼

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
	int i,j,t;
	int a[10];
	srand((int)time(0));
	printf("The score of the singers:\n");
	for(i=0;i<10;i++){
		a[i]=(int)(60+40*rand()/RAND_MAX);
		printf("%5d",a[i]);
	}
	printf("\n");
	for(i=0;i<9;i++)
		for(j=0;j<9-i;j++)
		if(a[j]>a[j+1]){
			int t;
			t=a[j];
			a[j]=a[j+1];
			a[j+1]=t;
		}
	printf("The sorted scores:\n");
	for(i=0;i<10;i++)
		printf("%5d",a[i]);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章