日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

快速排序原理解析(简单易懂图文代码配套)

發布時間:2023/12/31 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快速排序原理解析(简单易懂图文代码配套) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是快速排序

通冒泡排序一樣,快速排序也屬于叫喚排序,通過元素之間的比較和交換來達到目的。不同的是,冒泡排序在每一輪中只把1個元素冒泡到數列另一端,而快排則在每一輪挑選一個基準元素,并讓其他比他大的元素移到數列一邊,比它小的移到另一邊,相當是把數列拆成了兩個部分。這種思路其實叫分治法

選定基準元素(pivot)

在分治過程中,以基準元素為中心,把其它元素移動到它的左右兩邊。那么怎么選基準元素呢?最簡單的就是選數列第一個元素。還有就是隨機選擇數列中一個元素。不過都存在一個問題就是選的基準元素會是數列中最小的或者最大的值,在這種極端情況下,快速排序需要進行N輪,時間復雜度就退化成了O(n^2),不過平均時間復雜度還是保持在O(nlogn)。

元素交換排序過程

一、雙邊循環法:數組兩邊交換遍歷元素。

選出基準元素pivot,確定2個指針left跟right

  • right指針開始,right指向元素跟基準元素比較,如果大于或等于pivot,指針向左移動。小于基準則停止移動,切換到left指針。
  • left指針移動,跟基準元素比較,如果小于等于pivot,指針向右移動,如果大于pivot,指針停止移動

  • 由于6>3,left在元素6的位置停下,讓left與right指針所指向的元素進行交換。

按照此方法,一直循環比交換。

當循環到right指針和left指針重合的時候跟pivot基準元素交換。進行下一輪循環交換。

代碼遞歸實現:

private static void quickSort(int[] arr,int startIndex,int endIndex){//遞歸結束條件if (startIndex >= endIndex){return;}//得到基準元素int pivotIndex = partition(arr,startIndex,endIndex);//根基基準元素,分成兩部分進行遞歸排序quickSort(arr,startIndex,pivotIndex-1);quickSort(arr,pivotIndex+1,endIndex);}/*** 雙邊循環法* @param arr 待交換數組* @param startIndex 起始下標* @param endIndex 結束下標* @return left*/private static int partition(int[] arr, int startIndex, int endIndex) {//取第一個元素也可以隨機取作為基準元素int pivot = arr[startIndex];int left = startIndex;int right = endIndex;while (left != right){//控制right指針比較并左移while (left<right && arr[right]> pivot){right--;}//控制left指針比較并右移while (left<right && arr[left] <= pivot){left++;}//交換left和right指針指向的元素if (left<right){int temp = arr[left];arr[left] = arr[right];arr[right] = temp;}}//pivot和指針重復交換arr[startIndex] = arr[left];arr[left] = pivot;return left;}public static void main(String[] args) {int[] arr = {4,7,2,5,6,1,8};quickSort(arr,0,arr.length-1);System.out.println(Arrays.toString(arr));}

二、單邊循環法:從數組一邊對元素遍歷交換元素。

選定基準元素pivot,設置mark指針指向數組起始位置,mark指針代表小于基準元素的區域邊界

1、從基準元素的下一個位置開始遍歷數組。如果遍歷到的大于基準,就繼續向后遍歷

2、如果遍歷到的小于基準,需要做兩件事

  • 把mark指針右移一位。
  • 最近遍歷到的與mark指針所在位置元素交換位置。

如圖遍歷到的是2>3,所以mark右移一位到2元素上面。在跟3元素交換位置得到下圖。

接下來依照以上方法一直交換到順序排列位置。

代碼遞歸實現:

private static void quickSort(int[] arr,int startIndex,int endIndex){//遞歸結束條件if (startIndex >= endIndex){return;}//得到基準元素int pivotIndex = partition(arr,startIndex,endIndex);//根基基準元素,分成兩部分進行遞歸排序quickSort(arr,startIndex,pivotIndex-1);quickSort(arr,pivotIndex+1,endIndex);}/*** 單邊循環法* @param arr 待交換數組* @param startIndex 起始下標* @param endIndex 結束下標* @return left*/private static int partition(int[] arr, int startIndex, int endIndex) {//取第一個元素也可以隨機取作為基準元素int pivot = arr[startIndex];int mark = startIndex;for (int i = startIndex+1; i < endIndex; i++) {if (arr[i]<pivot){mark ++;int temp = arr[mark];arr[mark] = arr[i];arr[i] = temp;}}//pivot和指針重復交換arr[startIndex] = arr[mark];arr[mark] = pivot;return mark;}public static void main(String[] args) {int[] arr = {4,7,2,5,6,1,8};quickSort(arr,0,arr.length-1);System.out.println(Arrays.toString(arr));}

總結

以上是生活随笔為你收集整理的快速排序原理解析(简单易懂图文代码配套)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。