LeetCode:快速排序
快速排序(Quicksort)是對氣泡排序的一種改進。
它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
設要排序的陣列是A[0]……A[N-1],首先任意選取一個資料(通常選用陣列的第一個數)作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動。
第一種實現:
package Sort;
import java.util.Arrays;
/**
*類描述:二分查詢的精髓在於控制迴圈的次數,進行遍歷
*@author: 張宇
*@date: 日期: 2018年8月20日 時間: 上午10:31:45
*@version 1.0
*/
public class QuickSort {
public static void main(String []args){
int[] arrs = {12,20,5,16,15,1,30,45,23,9};
quickSort(arrs,0,arrs.length-1);
System.out.println(Arrays.toString(arrs));
}
//快速排序,遞迴演算法
private static void quickSort(int[] arr, int low, int high) {
int start = low;
int end = high;
int key = arr[start];
while (start < end) {
// 要從尾到前面進行比較
while (start < end && arr[end] >= key) {
end--;
}
if (arr[end] <= key) {
int temp = arr[end];
arr[end] = arr[start];
arr[start] = temp;
}
// 要從前到後進行比較
while (start < end && arr[start] <= key) {
start++;
}
if (arr[start] >= key) {
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
}
if (start > low) {
quickSort(arr, low, start - 1);
}
if (end < high) {
quickSort(arr, end + 1, high);
}
}
}
時間複雜度:O(n*logn)
空間複雜度:O(n)
第二種實現:
// 快速排序的設計思路2
private void quickSort2(int[] arr, int low, int high) {
int start = low;
int end = high;
int key = arr[start];
while (start != end) {
while (start < end && key <= arr[end]) {
end--;
}
while (start < end && key >= arr[start]) {
start++;
}
if (start != end)
swap(arr, start, end);
}
swap(arr, start, low);
if (start > low) {
quickSort2(arr, low, start - 1);
}
if (end < high) {
quickSort2(arr, end + 1, high);
}
}
時間複雜度:O(n*logn)
空間複雜度:O(n)
原始碼github地址:https://github.com/zhangyu345293721/leetcode
相關文章
- C++快速排序與歸併排序的實現(LeetCode 912)C++排序LeetCode
- 排序之快速排序排序
- 排序:氣泡排序&快速排序排序
- 快速排序排序
- 快速排序&&歸併排序排序
- 快速排序快速入門排序
- 四、歸併排序 && 快速排序排序
- 選擇排序和快速排序排序
- 排序演算法__快速排序排序演算法
- 排序演算法:快速排序排序演算法
- 排序演算法-快速排序排序演算法
- 排序演算法 - 快速排序排序演算法
- 排序演算法——快速排序排序演算法
- 快速排序法排序
- java 快速排序Java排序
- 快速排序javaScript排序JavaScript
- js 快速排序JS排序
- javascript 快速排序JavaScript排序
- 分治—快速排序排序
- QuickSort 快速排序UI排序
- 快速排序-java排序Java
- [JAVA]快速排序Java排序
- 快速排序 java排序Java
- php插入排序,快速排序,歸併排序,堆排序PHP排序
- 排序演算法之 '快速排序'排序演算法
- #排序演算法#【4】快速排序排序演算法
- 《排序演算法》——快速排序(Java)排序演算法Java
- 遞迴-*快速排序遞迴排序
- 圖解快速排序圖解排序
- 三種快速排序排序
- 快速排序C++排序C++
- 簡單快速排序排序
- 【筆記】快速排序筆記排序
- 快速排序(Quick Sort)排序UI
- 冒泡和快速排序排序
- 重溫快速排序排序
- 快速排序 (Quick Sort)排序UI
- 三種快速排序演算法以及快速排序的優化排序演算法優化