C語言和Java之冒泡排序編程、分析
名字由來:
冒泡排序(Bubble Sort),是一種計算機科學領域的較簡單的排序算法。
它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序(如從大到小、首字母從Z到A)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。名字由來是因爲越小的元素會經由交換慢慢“浮”到數列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名“冒泡排序”。
排序原理:
- 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個;
- 對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數;
- 針對所有的元素重複以上的步驟,除了最後一個;
- 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
總之,從第一個數開始,依次往後比較,如果前面的數比後面的數大就交換,否則不作處理。這就類似燒開水時,壺底的水泡往上冒的過程。
算法分析:
-
時間複雜度分析
若文件的初始狀態是正序的,一趟掃描即可完成排序。所需的關鍵字比較次數C和記錄移動次數M均達到最小值:;
;因此最好時間複雜度爲O(n);
若初始文件是反序的,需要進行n-1趟排序。每趟排序要進行n-i次關鍵字的比較(1≤i≤n-1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值:;因此最壞時間複雜度爲O(n2);
綜上,因此冒泡排序總的平均時間複雜度爲O(n2) 。 -
算法穩定性分析
冒泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,是不會再交換的;如果兩個相等的元素沒有相鄰,那麼即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前後順序並沒有改變,所以冒泡排序是一種穩定排序算法。
源程序參考:
C語言:
/*本段簡短程序以“8個正整數升序排列”爲例*/
#include<stdio.h>
int main()
{
int a[8]; //定義數組
int m,n,i;
printf("請輸入8個正整數:\n");
for(i=0;i<8;i++) //利用for循環將要比較的8個正整數存入數組中,以用於後續參加排序
{
scanf("%d",&a[i]);
}
for(m=0;m<7;m++) //進行7次循環 實現7趟比較
for(i=0;i<7-m;i++) //每一趟中進行7-m次比較
if(a[i]>a[i+1]) //鄰兩個數比較,判斷是否進行“換位”操作
{
n=a[i];
a[i]=a[i+1];
a[i+1]=n;
}
printf("升序排列結果爲:\n");
for(i=0;i<8;i++) //for循環打印輸出排序後結果
{
printf("%d",a[i]);
printf("\n");
}
}
運行測試界面:
Java語言:
/*本段簡短程序以“8個正整數升序排列”爲例*/
import java.util.Scanner;
public class 冒泡排序 {
public static void main(String[] args) {
int[] arr=new int[8];
Scanner sc=new Scanner(System.in);
System.out.println("請輸入8個數字:");
for(int i=0;i<8;i++)
{
arr[i]=sc.nextInt(); //鍵盤輸入8個數字存放在數組中;
}
System.out.println("排序前是:");//調用方法,輸出排序前的數組;
arrayPrint(arr);
bubbleSort(arr); //調用方法
System.out.println("排序後是:");
arrayPrint(arr);
}
//冒泡法排序方法:
public static void bubbleSort(int[] arr)
{
for(int x=0;x<arr.length-1;x++)//控制次數,循環長度-1次
{
for(int y=0;y<arr.length-1-x;y++)
{
if(arr[y]>arr[y+1])
{
int temp=arr[y];
arr[y]=arr[y+1];
arr[y+1]=temp;
}
}
}
}
//遍歷數組方法,輸出數組:
public static void arrayPrint(int[] arr)
{
System.out.print("[");
for(int i=0;i<arr.length;i++)
{
if(i==arr.length-1){
System.out.print(arr[i]);
}
else
System.out.print(arr[i]+", ");
}
System.out.println("]");
}
}
運行測試界面:
分析及總結:
冒泡排序分從大到小和從小到大兩種排序方式。它們的唯一區別就是兩個數交換的條件不同,從大到小排序是前面的數比後面的小的時候交換,而從小到大排序是前面的數比後面的數大的時候交換。本篇文章以“8個正整數升序排列”爲例”,降序原理一樣,簡單改寫程序即可實現。