C語言的選擇排序,你知道原理嗎?

前言

前面的冒泡排序講得有點冗長,廢話太多,請堵着門見諒!今天的選擇排序儘量精簡。但是選擇排序有點抽象,我當初學的時候也是搞了很久才明白,所以就算看不懂也要樹立信心,學習是循序漸進的,搞算法不要成天想着用葵花寶典。

一、源碼實例

直接附上源碼,如果熟悉直接略過,初學者可詳看詳解!

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
	int i,j,t,k;
	int a[5];
	srand((int)time(0));
	printf("The score of the singers:\n");
	for(i=0;i<5;i++){
		a[i]=(int)(60+40*rand()/RAND_MAX);
		printf("%5d",a[i]);
	}
	printf("\n");
	for(i=0;i<4;i++){
		k=i;
		for(j=i+1;j<5;j++)
		if(a[j]>a[k]) k=j;
		if(k!=i){
			int t;
			t=a[i];
			a[i]=a[k];
			a[k]=t;
		}
	}
	for(i=0;i<5;i++)
	printf("%5d",a[i]);
}

二、代碼原理詳解

1.選擇排序原理

給出一個長度爲5 的數組:3 2 4 5 8 
它們的下標分別爲:      0 1 2 3 4 

從大到小排列,步驟如下:
(1)第一輪:從五個數中找出最大的一個數,與下標爲0的數交換。
具體實現:
①將a[0]的下標0賦值給k,用k表示最大數的下標。k=0
②將a[k]與a[1]比較,3>2,k的值不變。
③將a[k]與a[2]比較,3<4,將4所在下標賦值給k。k=2
④將a[k]與a[3]比較,4<5,將5所在下標賦值給k。k=3
⑤將a[k]與a[4]比較,5<8,將8所在下標賦值給k。k=4
找到了第一輪的最大值,將它與a[0]交換。即a[k]與a[0]交換。
數組變成:8 2 4 5 3
(2)第二輪:從四個數中找出最大的一個數,與下標爲1的數交換。
如果在第一輪看懂原理的話,這裏應該可以推算得出。
找到第二輪的最大值,a[k]與a[1]交換。
數組變成:8 5 4 2 3
(3)第三輪:從三個數中找出最大的一個數,與下標爲2的數交換。
該輪找出的最大值下標恰好爲2,k=2。不必進行交換
數組仍爲:8 5 4 2 3
(4)第四輪:從兩個數中找出最大的一個數,與下標爲3的數交換。
找出最大值的下標爲5,k=5,。a[k]與a[3]交換。
數組變成:8 5 4 3 2

2.代碼分析

爲避免讀者們不必要的上下翻滾,先再次附上源碼。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
	int i,j,t,k;
	int a[5];
	srand((int)time(0));
	printf("The score of the singers:\n");
	for(i=0;i<5;i++){
		a[i]=(int)(60+40*rand()/RAND_MAX);
		printf("%5d",a[i]);
	}
	printf("\n");
	for(i=0;i<4;i++){
		k=i;
		for(j=i+1;j<5;j++)
		if(a[j]>a[k]) k=j;
		if(k!=i){
			int t;
			t=a[i];
			a[i]=a[k];
			a[k]=t;
		}
	}
	for(i=0;i<5;i++)
	printf("%5d",a[i]);
}

分析:
①#include<stdio.h>爲C語言必要頭文件,不過多贅述。
②srand((int)time(0))中,srand函數位於頭文件中,
time函數位於頭文件<time.h>中。srand((int)time(0))語句可種下隨機數種子,這條語句是隨機取值的前提條件。
③a[i]=(int)(60+40*rand()/RAND_MAX);表示爲a[i]取60~100的隨機數,RAND_MAX表示(60+40),即爲最大範圍100。
④選擇排序的核心

for(i=0;i<4;i++){
		k=i;
		for(j=i+1;j<5;j++)
		if(a[j]>a[k]) k=j;
		if(k!=i){
			int t;
			t=a[i];
			a[i]=a[k];
			a[k]=t;
		}

數組長度爲5,需要進行4輪比較。

每輪比較都把 i 置爲最大數的下標,用k表示。即k=i。

用a[k]分別跟後續的所有數比較,每次比較時,如果遇到比a[k]更大的數,就改變k的值,將更大數的下標賦值給j。

for(j=i+1;j<5;j++)
if(a[j]>a[k]) k=j;語句執行完畢後,就找到了最大值的下標,並且賦給了k。k的值有可能與 i 的值重疊。

if(k!=i){
			int t;
			t=a[i];
			a[i]=a[k];
			a[k]=t;

它表示將最大數a[k]與第 i 輪比較所對應的 a[i] 交換。爲了讓 k 不與 i 重疊,if(k!=i)語句是必須的。

這樣就完成了選擇排序的執行。

對於初學者可能有點難理解,多花點時間消化消化!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章