必須掌握的八種排序(5-6)--氣泡排序,快速排序
阿新 • • 發佈:2019-01-02
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;
}