1. 程式人生 > >java實現氣泡排序和快速排序

java實現氣泡排序和快速排序

用java實現了氣泡排序快速排序,冒泡還是比較簡單的,但快速排序採坑了,網上有很多程式碼是有問題的,最後通過分析和實踐,終於弄明白了,分享出來以供大家一起學習~~

快速排序寫了2種實現方法,原理都是一樣的,快排的平均時間複雜度是O(N*logN)

實現思路:(基於遞迴實現)
1.選一個值作為中軸(理想情況選中值最好,但一般使用陣列的第一個值)。
2.基於中軸,將陣列分為兩部分,較小的分在左邊,較大的分在右邊。
3.對兩個子陣列分別重複上述過程進行排序。

import java.util.ArrayList;
import java.util.Arrays;

/**
 * Created by admin on 2017/12/8.
 */
public class SortArray { public static void main(String[] args) { final int[] arr1 = {3, 12, 3, 15, 2, 89, 45}; final int[] arr2 = {3, 12, 3, 15, 2, 89, 45}; final int[] arr3 = {3, 12, 3, 15, 2, 89, 45}; //呼叫冒泡 int[] sortResult1 = sort1(arr1); //呼叫快速 int
start = 0; int end = arr2.length-1; int[] sortResult2 = quickSort(arr2,start,end); int[] sortResult3 = quickSort2(arr3, start, end); System.out.println(Arrays.toString(sortResult1)); System.out.println(Arrays.toString(sortResult2)); System.out.println(Arrays.toString(sortResult3)); } //氣泡排序 從大到小
public static int[] sort1(int[] arr){ for (int i = arr.length-1; i > 0; i--){ for (int j=0; j<i; j++){ if (arr[j]<arr[j+1]){ int temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; } } } return arr; } //快速排序方法一 private static int[] quickSort(int[] arr, int low, int high){ if (low < high){ int index = partitions(arr, low, high); quickSort(arr, low, index-1); //遞迴排序左子陣列 quickSort(arr, index+1, high); //遞迴排序右子陣列 } return arr; } public static int partitions(int[] arr, int low, int high){ //arr2 = {3, 12, 3, 15, 2, 89, 45} int index = arr[low]; //中軸 while (low < high){ while (low < high && arr[high] >= index) high--; //arr[high]一直大於index,那麼就一直減小high arr[low] = arr[high]; //直到遇到比index小的值 交換到左端 while (low < high && arr[low] <= index) low++; //arr[low]一直小於index,那麼就一直增大low arr[high] = arr[low]; //直到遇到比index大的值 交換到右端 } arr[low] = index; //返回的是中軸的位置 return low; } //快速排序方法二 public static int[] quickSort2(int[] arr,int l,int r){ if(l>=r) return arr; int i = l; int j = r; int key = arr[l];//選擇第一個數為key while(i<j){ while(i<j && arr[j]>=key)//從右向左找第一個小於key的值 j--; if(i<j){ arr[i] = arr[j]; i++; } while(i<j && arr[i]<key)//從左向右找第一個大於key的值 i++; if(i<j){ arr[j] = arr[i]; j--; } } arr[i] = key; quickSort2(arr, l, i-1);//遞迴呼叫 quickSort2(arr, i+1, r);//遞迴呼叫 return arr; } }