資料結構——交換排序(氣泡排序,快速排序)
阿新 • • 發佈:2018-12-13
一.氣泡排序
1.原理:比較兩個相鄰的元素,將值大的元素交換至右端。
依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。重複第一趟步驟,直至全部排序完成。
2.時間複雜度
1.如果我們的資料正序,只需要走一趟即可完成排序。所需的比較次數C和記錄移動次數M均達到最小值,即:Cmin=n-1;Mmin=0;所以,氣泡排序最好的時間複雜度為O(n)。
2.如果很不幸我們的資料是反序的,則需要進行n-1趟排序。每趟排序要進行n-i次比較(1≤i≤n-1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值: 氣泡排序的最壞時間複雜度為:O(n2) 。
綜上所述:氣泡排序總的平均時間複雜度為:O(n2) 。
3.程式碼實現:
複製程式碼 /* * 氣泡排序 */ public class BubbleSort { public static void main(String[] args) { int[] arr={6,3,8,2,9,1}; System.out.println("排序前陣列為:"); for(int num:arr){ System.out.print(num+" "); } for(int i=0;i<arr.length-1;i++){//外層迴圈控制排序趟數 for(int j=0;j<arr.length-1-i;j++){//內層迴圈控制每一趟排序多少次 if(arr[j]>arr[j+1]){ int temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } System.out.println(); System.out.println("排序後的陣列為:"); for(int num:arr){ System.out.print(num+" "); } } }
二.快速排序
1.原理
選擇一個基準元素,通常選擇第一個元素或者最後一個元素,通過一趟掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大於等於基準元素,此時基準元素在其排好序後的正確位置,然後再用同樣的方法遞迴地排序劃分的兩部分。
2.圖解
3.程式碼實現
public class quickSort { inta[]={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}; public quickSort(){ quick(a); for(int i=0;i<a.length;i++) System.out.println(a[i]); } public int getMiddle(int[] list, int low, int high) { int tmp = list[low]; //陣列的第一個作為中軸 while (low < high) { while (low < high && list[high] >= tmp) { high--; } list[low] = list[high]; //比中軸小的記錄移到低端 while (low < high && list[low] <= tmp) { low++; } list[high] = list[low]; //比中軸大的記錄移到高階 } list[low] = tmp; //中軸記錄到尾 return low; //返回中軸的位置 } public void _quickSort(int[] list, int low, int high) { if (low < high) { int middle = getMiddle(list, low, high); //將list陣列進行一分為二 _quickSort(list, low, middle - 1); //對低字表進行遞迴排序 _quickSort(list, middle + 1, high); //對高字表進行遞迴排序 } } public void quick(int[] a2) { if (a2.length > 0) { //檢視陣列是否為空 _quickSort(a2, 0, a2.length - 1); } } }