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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

排序算法:归并排序、快速排序

發布時間:2024/9/30 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 排序算法:归并排序、快速排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

相關博客:

排序算法:冒泡排序、插入排序、選擇排序、希爾排序

排序算法:歸并排序、快速排序

排序算法:桶排序、計數排序、基數排序

排序算法:堆排序

十大排序算法小結


一、歸并排序:

1、工作原理:

歸并排序的采用分治思想,如果要排序一個數組,我們先把數組從中間分成前后兩個部分,然后對前后兩個部分分別進行排序,再將排好序的兩部分合并在一起,這樣整個數組就都有序了。

2、動圖演示:

3、Java代碼實現:

public class MergeSort {//歸并排序:public void mergeSort(int[] a,int p,int r){//遞歸終止條件if(p>=r) return;int q=(p+r)/2;//取數組的中間點mergeSort(a,p,q);//對前半部分進行排序mergeSort(a,q+1,r);//對后半部分進行排序merge(a, p, q, r);//合并前后兩個部分}//merge()函數是歸并排序的重點public void merge(int[] a,int p,int q,int r){//初始化變量:i表示前半部分的下標,j表示后半部分的下標,k表示臨時數組的下標int i=p;int j=q+1;int k=0;int[] tmp = new int[r-p+1];while(i<=q && j<=r){if(a[i]<=a[j]){tmp[k++]=a[i++];}else{tmp[k++]=a[j++];}}//將剩余數據拷貝到臨時數組中for(;i<=q;i++) tmp[k++]=a[i];for(;j<=r;j++) tmp[k++]=a[j];//將tmp臨時數組拷貝回原數組for(int x=0;x<r-p+1;x++) a[p+x]=tmp[x];} }

4、算法分析:

(1)歸并排序是一種穩定的排序算法;

(2)最好、最好、平均時間復雜度都是O(nlogn)。

(3)空間復雜度是O(n),所以不是原地排序。這也是歸并排序的一個致命弱點。


二、快速排序:

1、工作原理:

快速排序也是利用分治思想。如果要排序一組數據,我們先選擇這組數據中任意一個數據作為分區點pivot,然后遍歷這組數據,將小于分區點pivot的放到左邊,大于分區點pivot的放到右邊,將pivot放到中間。然后再分別對左右兩部分進行排序。

2、圖片演示:

3、Java代碼實現:

public class QuickSort {public void quickSort(int[] a,int p,int r){//遞歸終止條件:if(p>=r) return;//獲取分區點:int q=partition(a,p,r);quickSort(a,p,q-1);//對左分區進行排序quickSort(a,q+1,r);//對右分區進行排序}//返回分區點,快速排序的核心:public int partition(int[] a,int p,int r){int i=p;int pivot = a[r];for(int j=p;j<=r;j++){if(a[j]<pivot){swap(a,i,j);i++;}}swap(a, i, r);return i;}public void swap(int[] a,int x,int y){int temp=a[x];a[x]=a[y];a[y]=temp;} }

其中,快速排序的核心就是paitition()分區函數,它的過程如下圖所示:

4、算法分析:

(1)快速排序是一種原地排序,空間復雜度為O(1)。

(2)快速排序是一種不穩定算法。

(3)快速排序是的最好時間復雜度、平均時間復雜度為O(nlogn)。但是在極端情況下,如果數組中的數據原來就是有序的,比如1,3,5,6,8,如果我們每次選擇最后一個元素作為pivot,那每次分區得到的兩個區間就是不均等的,我們需要大約進行n次分區操作,才能完成快排的整個過程,每次分區我們平均要掃描大約n/2個元素,這時時間復雜度為O(n^2),也就是最壞時間復雜度。


三、小結:歸并與快排的區別:

(1)歸并排序和快速排序都是用分治的思想,代碼都是通過遞歸來實現的,但是歸并排序的核心是merge()合并函數,而快速排序的核心是partition()分區函數。歸并排序的處理過程是從下到上,先處理子問題,然后再合并。而快速排序的處理過程正好相反,它的處理過程是從上到下的,先分區,然后再處理子問題。這兩種排序的處理過程如下圖所示:

(2)歸并排序算法是一種任何情況下時間復雜度都比較穩定的排序算法,時間復雜度都是O(nlogn);快速排序算法最壞情況下時間復雜度為O(n^2),但是平均時間復雜度都是O(nlogn),不僅如此,快速排序時間復雜度退化到O(n^2)的概率非常小,我們可以通過合理選擇pivot來避免這種情況。

(3)歸并排序不是原地排序算法,空間復雜度比較高,為O(n);快速排序是原地排序算法,空間復雜度為O(1)。

(4)歸并排序是穩定的算法,快速排序不穩定。

?

?

總結

以上是生活随笔為你收集整理的排序算法:归并排序、快速排序的全部內容,希望文章能夠幫你解決所遇到的問題。

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