氣泡排序法(C語言)
常用的排序方法有氣泡排序法,選擇排序法,插入排序法以及希爾排序法等。本文著重講解如何利用C程式碼,實現氣泡排序。
首先,要了解什麼是氣泡排序。氣泡排序是常用的一種排序方法,其基本方法就是逐次比較。即一次比較兩個數,若它們的順序錯誤,則它們交換;重複進行,直到沒有需要交換為止。
以升序排序為例:
1、比較相鄰數字的大小,若第一個數比第二個數大,則相互交換;
2、對每一對相鄰的數作相同的工作,那麼最後的數應該是最大的數;
3、針對所有數(除了最後一個)重複上述步驟,直到沒有任何一對數字需要比較為止。
需要注意的是,第3條中所謂的“最後一個”是指前幾步中已經處理過的最大的數,而不是整個數列的最後一個數。
例如,將下列數列用氣泡排序法從小到大重新排列;
49 38 65 97 76 13 27 49
每次排序後數列的變化如下:
第一趟排序:38 49 65 76 13 27 49 97
第二趟排序:38 49 65 13 27 49 76 97
第三趟排序:38 49 13 27 49 65 76 97
第四趟排序:38 13 27 49 49 65 76 97
:
:
:
經過一系列過程,最終數列次序為:13 27 3849 49 65 76 97.
通過對以上排序的分析,我們可以簡要畫出氣泡排序的流程圖:
觀察流程圖,我們不難發現通過一個簡單的迴圈結構,即可實現對一組數進行排序。
部分程式如下:
#include <stdio.h>
int main ()
{
int i, j,temp;
int array[n];
for (i = 0;i <8; i++)
{
scanf ("%d",&array[i]); //通過陣列和迴圈輸需要排序的數列
}
printf ("Before ordering,the rank is : ");
for (i = 0;i < 8 ; i++)
{
printf ("%d ",array[i]);
}
printf (" "); //顯示排序之前的陣列
for (j = 0;j < n-1; j++)
{
for(i = 0;i < n-j-1; i++) //兩次迴圈實現排序
{
if (array[i] > array[i+1]) //相鄰兩數字比較
{
temp = array[i];
array[i] = array[i+1];
array[i+1] = temp; //中間變數temp實現相鄰元素的交換
}
}
}
printf ("After ordering,the rank is :");
for(i = 0;i < n ; i++)
{
printf ("%d ",array[i]); //顯示排序後的陣列
}
printf (" ");
return 0;
}
數字的排序:
#include <stdio.h>
#define SIZE 10
int main()
{
int a[SIZE]={12 ,43,9,13,67,98,101,89,3,35};//十個數的無序數列
int i,j,t;
printf("此程式使用氣泡排序法排列無序數列! ");
//氣泡排序
for(i=0;i<10-1;i++)//n個數的數列總共掃描n-1次
{
for(j=0;j<10-i-1;j++)//每一趟掃描到a[n-i-2]與a[n-i-1]比較為止結束
{
if(a[j]>a[j+1])//後一位數比前一位數小的話,就交換兩個數的位置(升序)
{
t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
}
printf("排列好的數列是: ");
//輸出排列好得吃數列
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}
字元排序:
#include <stdio.h>
#define SIZE 10
int main()
{
char a[SIZE]={'i','l','o','v','e','y','o','u','y','x'};//十個數的無序數列
int i,j;
char t;
printf("此程式使用氣泡排序法排列無序數列! ");
//氣泡排序
for(i=0;i<10-1;i++)//n個數的數列總共掃描n-1次
{
for(j=0;j<10-i-1;j++)//每一趟掃描到a[n-i-2]與a[n-i-1]比較為止結束
{
if(a[j]>a[j+1])//後一位數比前一位數小的話,就交換兩個數的位置(升序)
{
t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
}
printf("排列好的字元組是: ");
//輸出排列好得吃數列
for(i=0;i<10;i++)
{
printf("%c ",a[i]);
}
return 0;
}
用函式來解決這個問題:
#include <stdio.h>
void function(char a[],int);//尤其注意,此處的函式宣告必須是char a[],因為這裡穿的是地址,不能僅僅使用char
int main()
{
int i;
char a[10]={'i','l','o','v','e','y','o','u','y','x'};//十個數的無序字元數列
printf("此程式使用氣泡排序法排列無序數列! ");
function(a,10);//呼叫氣泡排序
printf("排列好的字元組是: ");
//輸出排列好得吃數列
for(i=0;i<10;i++)
{
printf("%c ",a[i]);
}
return 0;
}
void function(char a[],int m)
{
//氣泡排序
int i,j;
char t;
for(i=0;i<m-1;i++)//n個數的數列總共掃描n-1次
{
for(j=0;j<m-i-1;j++)//每一趟掃描到a[n-i-2]與a[n-i-1]比較為止結束
{
if(a[j]>a[j+1])//後一位數比前一位數小的話,就交換兩個數的位置(升序)
{
t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
}
return;
}
執行情況:
知識總結:
氣泡排序法:也叫升序排序法,但是相比起二分法查詢只能應用於有序數列,二如何將一個無序數列變的有序就可以使用氣泡排序法!!!
對上面的過程進行總結:
該思想體現在成續上的解法是:
例項:
氣泡排序不僅僅可以應用於數字同樣可以應用於字元字母的快速排序: