1. 程式人生 > >必須掌握的八種排序(5-6)--氣泡排序,快速排序

必須掌握的八種排序(5-6)--氣泡排序,快速排序

5、氣泡排序

(1)基本思想:在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。

(2)理解圖

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

(3)程式碼實現

/**
 * 氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,
 * 如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,
 * 也就是說該數列已經排序完成。
 * 這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。
 * 步驟:
 *    1、比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
      2、對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
      3、針對所有的元素重複以上的步驟,除了最後一個。
      4、持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
 * @author
Administrator * */
public class bubbleSort { public bubbleSort() { int a[] = { 49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5, 4, 62, 99, 98, 54, 56, 17, 18, 23, 34, 15, 35, 25, 53, 51 }; int temp = 0; for (int i = 0; i < a.length - 1; i++) { for
(int j = 0; j < a.length - 1 - i; j++) { if (a[j] > a[j + 1]) { temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } for (int i = 0; i < a.length; i++) System.out.println(a[i]); } }

6、快速排序

(1)基本思想:選擇一個基準元素,通常選擇第一個元素或者最後一個元素,通過一趟掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大於等於基準元素,此時基準元素在其排好序後的正確位置,然後再用同樣的方法遞迴地排序劃分的兩部分。

(2)理解圖

這裡寫圖片描述

這裡寫圖片描述

(3)程式碼實現

public static void quickSort(int [] a,int left,int right){
        //快速排序演算法   
        //找一個基準元素,把陣列分為兩個部分,前面一部分比基準元素小  後面一部分比基準元素大 保證前面一部分的元素都小於後面一部分的元素
        //一般以第一個元素作為基準元素
        //找兩個助手 ,低助手和高助手  ,分別位於陣列的兩端
        //低助手從左往右找比基準元素大的元素 找到則交換 記錄該位置 找不到的話 低助手索引加1
        //高助手從右往前找比基準元素小的元素,找到則交換 ,記錄該位置,找不到的話,低助手索引減1
        //直到低助手和高助手重疊 ,則記錄該位置   ,陣列就被分成了兩個部分 再對這兩部分進行遞迴,再分成兩部分  最後合即為排好序的陣列

        if(left==right){
            return;
        }
        int partition=partition(a,left,right);
        //遞迴
        quickSort(a,left,partition);
        quickSort(a,partition+1,right);

    }  
    /**
     * 找中間位置的方法
     * @param a 待排序陣列
     * @param left :低助手   低助手從左往右找比基準元素大的元素 找到則交換 記錄該位置 找不到的話 低助手索引加1
     * @param right: 高助手  高助手從右往前找比基準元素小的元素,找到則交換 ,記錄該位置,找不到的話,低助手索引減1
     */
    public static int partition(int [] a,int left,int right){
        int base=a[left];
        //找兩個助手 ,低助手和高助手  ,分別位於陣列的兩端
        left--;
        right++;
        while(left<right){
            left++;
            while(a[left]<base){
                left++;
            }
            right--;
            while(a[right]>base){
                right--;
            }

            if(left<right){
                swap(a,left,right);
            }
        }
        return right;
    }
    //交換值的函式
    public static  void swap(int [] a,int i,int j){
        int temp;
        temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }