1. 程式人生 > >【c語言】氣泡排序和選擇排序

【c語言】氣泡排序和選擇排序

1.氣泡排序

氣泡排序將一個列表中的兩個元素進行比較,並將最小的元素交換到頂部。兩個元素中較小的會冒到頂部,而較大的會沉到底部,該過程將被重複執行,直到所有元素都被排序。

氣泡排序示意圖

以如圖所示的氣泡排序為例,每次比較相鄰的兩個值,值小的交換到前面,每輪結束後值最大的數交換到了最後。第一輪需要比較4次;第二輪需要比較3次;第三輪需要比較2次;第四輪需要比較1次。

   那麼如何用二重迴圈將5個數排序呢?5個數存放在一維陣列中,外層迴圈控制比較多少輪,迴圈變數i;內層控制每輪比較多少次,迴圈變數就,如下圖所示:

程式碼如下:

#include <stdio.h>
#define NUM 5
void arrsort(int[],int);
void arrout(int[],int);
 main(){
	 int a[NUM]={16,25,9,90,23};
	 arrout(a,NUM);//輸出a陣列中原始資料
	 arrsort(a,NUM);//對a陣列中的數進行排序
     arrout(a,NUM);//輸出排序後a陣列中的資料
}
void arrsort(int a[],int n){
	for(int i=0;i<n-1;i++){
		for(int j=0;j<n-1-i;j++){
			if(a[j]>a[j+1]){ 
			  int temp =a[j+1];
			  a[j+1] = a[j];
			  a[j] = temp;
			}
		}
	}
	
}
void arrout(int a[],int n){
   int i;
   for(i=0;i<n;i++){
    printf("%3d",a[i]);
   }
   printf("\n");
 }

輸出結果為:

2.選擇排序

在介紹選擇排序法之前,憑介紹一種把最小的數放在第一個位置上的演算法,當然也可以用前面所講的氣泡排序法,現在我們改用一種新的演算法: 其指導思想是先並不急於調換位置,先從a[0]開始逐個檢查,看哪個數最小,就記下該數所在的位置p,等一躺掃描完畢,再把a[p]和a[]對調,這時a[0] a[9]最小的資料就換到了最前面的位置。演算法的步驟如下。
(1)先假設a[0]的數最小,記下此時的位置p。
(2)依次把a[p]和a[i]Gi從2變化到9)進行比較,每次比較時,若aj]的數比a[p]中的數小,則把i的值賦給p,使p總是指向當前所掃描過的最小數的位置,也就是說a[p]總是等於所有掃描過的數中最小的那個數。在依次-- 比較後,p就指向 10個數中 最小的數所在位置,即a[p]就是10 個數中最小的那個數。
(3)把a[p]和a[0]的數對調,那麼最小的數就在a[0]中了,也就是在最前面了。

如果現在重複此演算法,但每重複一次, 進行比較的數列範圍就向後移動一個位置,即第二遍比較時範圍就從第2個數一直到第 n個數,在此範圍內找最小的數的位置p,然後把a[p]與a[2]x對調,這樣從第2個數開始到第n個數中,最小數就在a[2]中了,第三遍就從第個數到第n 個數中去找最小的數,再把alp]與a[3]對調..此過程重複n-1次後,就把a組中n個數按從小到大的順序排好了。這種排序的方法就是選擇排序法。

選擇選擇排序,只需上面的程式碼中替換arrsort()方法內容即可,此處省略其他程式碼,只給出修改部分

void arrsort(int a[],int n){
	int min =0;
    for(int i=0;i<n-1;i++){
     min =i;
	 for(int j=i+1;j<n;j++){
	  if(a[j]<a[min])
		  min=j;
	 }
	 int temp = a[min];
		 a[min] = a[i];
	     a[i] = temp;
	}
}