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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构值排序算法(三)-快速排序

發(fā)布時(shí)間:2025/3/20 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构值排序算法(三)-快速排序 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
基本思想:

快速排序采用的思想是分治思想。

第一趟排序:快速排序是找出一個(gè)元素(理論上可以隨便找一個(gè))作為基準(zhǔn)(pivot),然后對數(shù)組進(jìn)行分區(qū)操作,使基準(zhǔn)左邊元素的值都不大于基準(zhǔn)值,基準(zhǔn)右邊的元素值 都不小于基準(zhǔn)值,如此作為基準(zhǔn)的元素調(diào)整到排序后的正確位置。

遞歸排序:第二步就是對高段位和地段為兩部分進(jìn)行遞歸排序。

一趟快速排序的算法的步驟是:
1)設(shè)置兩個(gè)變量low、high,排序開始的時(shí)候:low=0,high=N-1;
2)以第一個(gè)數(shù)組元素作為關(guān)鍵數(shù)據(jù),賦值給key,即key=A[0];
3)從high開始向前搜索,即由后開始向前搜索(high--),找到第一個(gè)小于key的值A(chǔ)[high],將A[high]和A[low]互換;
4)從i開始向后搜索,即由前開始向后搜索(low++),找到第一個(gè)大于key的A[low],將A[low]和A[high]互換;
5)重復(fù)第3、4步,直到low=high

一趟快速排序的算法的圖解是:


QuickSortClass.java

public class QuickSortClass {private int[] array;public int[] getArray() {return array;}public void setArray(int[] array) {this.array = array;}//快速排序 public void quikSort(){ QuikSort(0,array.length-1); } //遞歸的快速排序 private void QuikSort(int low,int high){ if(low>=high){ return; }else{ int pivot = array[low]; //以第一個(gè)元素為基準(zhǔn) int partition =partition(low,high,pivot); //對數(shù)組進(jìn)行劃分,比pivot小的元素在低位段,比pivot大的元素在高位段 QuikSort(low,partition-1); //對劃分后的低位段進(jìn)行快速排序 QuikSort(partition+1,high); //對劃分后的高位段進(jìn)行快速排序 } } //以pivot為基準(zhǔn)對下標(biāo)low到high的數(shù)組進(jìn)行劃分 ,low 數(shù)組段的最小下標(biāo) ,high 數(shù)組段的最大下標(biāo) , pivot 劃分的基準(zhǔn)元素 , 劃分完成后基準(zhǔn)元素所在位置的下標(biāo) private int partition(int low,int high,int pivot){ while(low<high){ while(low<high &&array[high]>=pivot){ //從右端開始掃描,定位到第一個(gè)比pivot小的元素 high--; //如果array[high]比基準(zhǔn)pivot大,就不管,繼續(xù)向前移動(dòng)} swap(low,high); //如果array[high]比基準(zhǔn)pivot小,就交換low和highwhile(low<high &&array[low]<=pivot){ //從左端開始掃描,定位到第一個(gè)比pivot大的元素 low++; //如果array[low]比基準(zhǔn)pivot小,就不管,繼續(xù)向后移動(dòng)} swap(low,high); //如果array[low]比基準(zhǔn)pivot大,就交換low和high } return low; } //交換數(shù)組中兩個(gè)元素的數(shù)據(jù) private void swap(int low,int high){ int temp = array[high]; array[high] = array[low]; array[low] = temp; } }


TestQuickSort.java

public class TestQuickSort {public static void main(String[] args) {// TODO Auto-generated method stubint[] list={25,24,6,65,11,43,22,51};QuickSortClass qs=new QuickSortClass();System.out.println("快排前的數(shù)組是:");for(int i=0;i<list.length;i++){System.out.print(list[i]+" ");}qs.setArray(list);qs.quikSort();int[] list2= qs.getArray();System.out.println();System.out.println("快排后的數(shù)組是:");for(int i=0;i<list2.length;i++){System.out.print(list2[i]+" ");}} }

算法分析:

在最差的情況下,劃分有n個(gè)元素構(gòu)成的數(shù)組需要進(jìn)行n次比較和n次移動(dòng),因此劃分所需的時(shí)間為O(n).在最差的情況下,每次主元會(huì)將數(shù)組劃分成為一個(gè)大數(shù)組和一個(gè)空數(shù)組。這個(gè)大數(shù)組的規(guī)模是在上次劃分的基礎(chǔ)上減一。該算法需要(n-1)+(n-2)+...+2+1=O(n2).

在最佳的情況下,每次主元會(huì)將數(shù)組劃分成為規(guī)模大致相等的部分。設(shè)T(n)標(biāo)識使用快速排序算法堆包含n個(gè)元素的數(shù)組排序所需要的時(shí)間,因此

? ? ? ? ? ? ? ? ? ? ? ? T(n)=T(n/2)+T(n/2)+n

快速排序的T(n)=O(nlogn)


總結(jié)

以上是生活随笔為你收集整理的数据结构值排序算法(三)-快速排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。