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
- 排序之快速排序排序
- 排序:氣泡排序&快速排序排序
- 快速排序排序
- 快速排序&&歸併排序排序
- 快速排序快速入門排序
- 排序演算法 - 快速排序排序演算法
- 選擇排序和快速排序排序
- 四、歸併排序 && 快速排序排序
- 排序演算法__快速排序排序演算法
- 排序演算法:快速排序排序演算法
- python 快速排序Python排序
- 快速排序法排序
- 分治—快速排序排序
- java 快速排序Java排序
- javascript 快速排序JavaScript排序
- 快速排序javaScript排序JavaScript
- js 快速排序JS排序
- 快速排序-java排序Java
- php插入排序,快速排序,歸併排序,堆排序PHP排序
- 排序演算法之 '快速排序'排序演算法
- 快速排序 (Quick Sort)排序UI
- 快速排序C++排序C++
- 三種快速排序排序
- 8.22_快速排序排序
- 圖解快速排序圖解排序
- 簡單快速排序排序
- 遞迴-*快速排序遞迴排序
- 堆排序和快速排序效能比較排序
- php實現 歸併排序,快速排序PHP排序
- LeetCode入門指南 之 排序LeetCode排序
- 氣泡排序、歸併排序與快速排序比較排序
- Sorting 排序演算法: Quick Sort 快速排序排序演算法UI
- 【C語言】氣泡排序與快速排序C語言排序
- Go實現氣泡排序和快速排序Go排序
- 排序演算法 - 快速插入排序和希爾排序排序演算法
- 快速排序演算法排序演算法
- 三路快速排序排序