C語言和Java之冒泡排序編程、簡單分析

C語言和Java之冒泡排序編程、分析

名字由來:
冒泡排序(Bubble Sort),是一種計算機科學領域的較簡單的排序算法。
它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序(如從大到小、首字母從Z到A)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。名字由來是因爲越小的元素會經由交換慢慢“浮”到數列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名“冒泡排序”。

排序原理:

  1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個;
  2. 對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數;
  3. 針對所有的元素重複以上的步驟,除了最後一個;
  4. 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
    總之,從第一個數開始,依次往後比較,如果前面的數比後面的數大就交換,否則不作處理。這就類似燒開水時,壺底的水泡往上冒的過程。

算法分析:

  1. 時間複雜度分析
    若文件的初始狀態是正序的,一趟掃描即可完成排序。所需的關鍵字比較次數C和記錄移動次數M均達到最小值:;
    在這裏插入圖片描述;因此最好時間複雜度爲O(n);
    若初始文件是反序的,需要進行n-1趟排序。每趟排序要進行n-i次關鍵字的比較(1≤i≤n-1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值:在這裏插入圖片描述;因此最壞時間複雜度爲O(n2);
    綜上,因此冒泡排序總的平均時間複雜度爲O(n2) 。

  2. 算法穩定性分析
    冒泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,是不會再交換的;如果兩個相等的元素沒有相鄰,那麼即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前後順序並沒有改變,所以冒泡排序是一種穩定排序算法。

源程序參考:

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");
	} 
 } 

運行測試界面:

C語言冒泡排序

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("]");
    }
}

運行測試界面:

Java語言冒泡排序
分析及總結:

冒泡排序分從大到小和從小到大兩種排序方式。它們的唯一區別就是兩個數交換的條件不同,從大到小排序是前面的數比後面的小的時候交換,而從小到大排序是前面的數比後面的數大的時候交換。本篇文章以“8個正整數升序排列”爲例”,降序原理一樣,簡單改寫程序即可實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章