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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

快速排序详解以及java实现

發布時間:2023/12/10 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快速排序详解以及java实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

快速排序作為一種高效的排序算法被廣泛應用,SUN的JDK中的Arrays.sort?方法用的就是快排。

快排采用了經典的分治思想(divide and conquer):

?Divide:選取一個基元X(一般選取數組第一個元素),通過某種分區操作(partitioning)將數組劃分為兩個部分:左半部分小于等于X,右半部分大于等于X。

Conquer: 左右兩個子數組遞歸地調用Divide過程。

Combine:快排作為就地排序算法(in place sort),不需要任何合并操作

?可以看出快排的核心部分就是劃分過程(partitioning),下面以一個實例來詳細解釋如何劃分數組(圖取自于《算法導論》)

?初始化:選取基元P=2,就是數組首元素。i=1,j=i+1=2 (數組下標以1開頭)

循環不變量:2~i之間的元素都小于或等于P,i+1~j之間的元素都大于或等于P

循環過程:j從2到n,考察j位置的元素,如果大于等于P,就繼續循環。如果小于P,就將j位置的元素(不應該出現在i+1~j這個區間)和i+1位置(交換之后仍在i+1~j區間)的元素交換位置,同時將i+1.這樣就維持了循環不變量(見上述循環不變量說明)。直到j=n,完成最后一次循環操作。

要注意的是在完成循環后,還需要將i位置的元素和數組首元素交換以滿足我們最先設定的要求(對應圖中的第i步)。

細心的讀者可能會想到另一種更直白的分區方法,即將基元取出存在另一相同大小數組中,遇到比基元小的元素就存儲在數組左半部分,遇到比基元大的元素就存儲在數組右半部分。這樣的操作復雜度也是線性的,即Theta(n)。但是空間復雜度提高了一倍。這也是快排就地排序的優勢所在。

?

最后附上快排的java代碼實現:

public class QuickSort {private static void QuickSort(int[] array,int start,int end){if(start<end){int key=array[start];//初始化保存基元int i=start,j;//初始化i,jfor(j=start+1;j<=end;j++){if(array[j]<key)//如果此處元素小于基元,則把此元素和i+1處元素交換,并將i加1,如大于或等于基元則繼續循環{int temp=array[j];array[j]=array[i+1];array[i+1]=temp;i++;}}array[start]=array[i];//交換i處元素和基元array[i]=key;QuickSort(array, start, i-1);//遞歸調用QuickSort(array, i+1, end);}}public static void main(String[] args){int[] array=new int[]{11,213,134,44,77,78,23,43};QuickSort(array, 0, array.length-1);for(int i=0;i<array.length;i++){System.out.println((i+1)+"th:"+array[i]);}} }

?以下是運行結果:

?

轉載于:https://www.cnblogs.com/developerY/p/3163997.html

總結

以上是生活随笔為你收集整理的快速排序详解以及java实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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