数据结构与算法之快速排序
生活随笔
收集整理的這篇文章主要介紹了
数据结构与算法之快速排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數據結構與算法之快速排序
目錄
1. 快速排序介紹
快速排序(Quicksort)是對冒泡排序的一種改進。基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列 。
快速排序:
快速排序法示意圖
2. 代碼實現
代碼一:隨機快排,長期期望的 O(nlogn)
package sort;import java.util.Arrays;public class QuickSort {public static void quickSort(int[] arr) {if (arr==null||arr.length<2)return;quickSort(arr,0,arr.length-1);}public static void quickSort(int[] arr,int l,int r) {if (l<r){swap(arr,(int)(l+Math.random()*(r-l+1)),r);int[] p = partition(arr,l,r);quickSort(arr,l,p[0]-1);quickSort(arr,p[1]+1,r);}}private static int[] partition(int[] arr, int l, int r) {int less = l-1;int more = r;while (l<more){if (arr[l]<arr[r])swap(arr,++less,l++);else if (arr[l]>arr[r])swap(arr,--more,l);else l++;}swap(arr,more,r);return new int[]{less+1,more};}private static void swap(int[] arr, int i, int r) {int tem = arr[i];arr[i] = arr[r];arr[r] = tem;}public static void main(String[] args) {int[] arr = {5, 3, 1, 2, 6, 4, 4};quickSort(arr);System.out.println(Arrays.toString(arr));} }代碼二:普通快排
package com.sort;import java.util.Arrays;public class QuickSort {public static void main(String[] args) {int[] arr = {2,10,8,22,34,5,12,28,21,11};quickSort(arr,0,arr.length-1);System.out.println(Arrays.toString(arr));}public static void quickSort(int[] arr, int left, int right){int l = left;int r = right;//pivot 中軸int pivot = arr[(left+right)/2];int temp = 0;//while循環的目的是讓比pivot值小放到左邊//比pivot值大放右邊while (l<r){ // 在pivot的左邊一直找,找到大于等于pivot值,才退出while (arr[l]<pivot){l +=1;} // 在pivot的右邊一直找,找到小于等于pivot值,才退出while (arr[r]>pivot){r-=1;}//如果 l>=r ,說明pivot的左右邊的值,已經按照左邊全部是小于等于pivot值//右邊全部是大于等于pivot值if (l>=r){break;}//交換temp = arr[l];arr[l] = arr[r];arr[r] = temp;//如果交換完后,發現pivot,發現arr[l] == pivot值相等 r--, 前移if (arr[l] == pivot){r-=1;}//如果交換完后,發現pivot,發現arr[r] == pivot值相等 l++, 后移if (arr[r] == pivot){l+=1;}}//如果 l==r ,必須l++,r--,否則出現棧溢出if (l == r){l += 1;r -= 1;}//向左遞歸if (left <r){quickSort(arr,left,r);}//向右遞歸if (right>l){quickSort(arr,l,right);}} }編譯結果:
800萬條數據大概2s能排好。
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的数据结构与算法之快速排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构与算法之希尔排序
- 下一篇: 数据结构与算法之归并排序