氣泡排序(c語言)
阿新 • • 發佈:2021-01-12
氣泡排序演算法詳解:
1.氣泡排序簡介: 氣泡排序是交換排序演算法中的一個簡單演算法,是比較基礎的。 它的特點是每一趟排序能確定一個或多個關鍵字的最終位置。
2.氣泡排序原理介紹(假設按升序排序): 對於給定n個記錄,從第一個記錄開始依次對相鄰的兩個記錄進行比較,當前面的記錄大於後面的記錄時,交換位置,進行一輪比較和換位後,n個記錄的最大記錄將位於第n位,然後對前(n-1)個記錄進行第二輪比較;重複該過程,直到記錄剩下一個為止。
3.舉例說明:
例子1:
假設待排序序列為:6、5、4、3、2、1;
第一趟排序:5、4、3、2、1、6;
第二趟排序:4、3、2、1、5、6;
第四趟排序:2、1、3、4、5、6;
第五趟排序:1、2、3、4、5、6;
特點:
(1)一趟排序可以確定一個關鍵字的最終位置。
(2)共有6個元素,需要5趟排序。
例子2:
假設待排序序列為:8、12、20、10、18、24;
第一趟排序:8、12、10、18、20、24;
第二趟排序:8、10、12、18、20、24;
第三趟排序:8、10、12、18、20、24;
特點:
(1)一趟排序可以確定多個關鍵字的最終位置。
(2)共有6個元素,2趟排序即可完成排序。
(3)如果一趟排序沒有進行關鍵字的位置交換,則說明排序已完成。
總結:
(1)氣泡排序中,一趟排序可以確定多個關鍵字的最終位置。
(3)如果一趟排序沒有進行關鍵字的位置交換,則說明排序已完成。
4.程式碼實現:
程式碼說明:儲存關鍵字的陣列是從下標1(即a[1])開始儲存的,下標0用作交換兩個關鍵字的中間變數,即a[0]
帶註釋的:
#include<stdio.h>
int main()
{
int a[7];//定義一個長度為六的陣列,從下標1開始儲存,a[0]用作中間變數
int i; //作為迴圈變數
printf("請輸入六個整數,中間用空格隔開:\n");
//此處是從下標為1的位置開始儲存這六個整數,a[0]用作中間變數
for(i=1; i<=6; i++)
{
scanf("%d",&a[i]);
}
//下面是氣泡排序演算法部分
int m= 6-1; //m的值是待排序關鍵字的個數減一,即至多進行排序的趟數
int flag=1; //flag用來判斷某一趟排序中是否進行了關鍵字的位置交換
while(m>0 && flag==1)
{
flag = 0; //先把flag設為0,如果上一趟排序中沒有進行關鍵字的交換,則說明排序完成,終止迴圈。
for(i=1; i<=m; i++)//完成一次for迴圈,意味著完成了一趟排序
{
if(a[i] > a[i+1])
{
a[0] = a[i];
a[i] = a[i+1];
a[i+1] = a[0];
flag = 1;//如果此趟排序進行了關鍵字的交換,則把flag設為1,繼續進行下一趟迴圈
}
}
m--;//完成一趟排序後,最後一個元素的下標減一
}
//排序完成輸出陣列
printf("氣泡排序後的結果為:");
for(i=1; i<=6; i++)
{
printf("%d ",a[i]);
}
}