java實現氣泡排序和快速排序
阿新 • • 發佈:2019-02-18
用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;
}
}