【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; } }