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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

快速排序的实现及优化

發(fā)布時(shí)間:2025/3/21 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快速排序的实现及优化 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、分割操作單向掃描

public class QuickSort {public int partition(int[] a, int left, int right) {int temp, pivot;//pivot存放主元int i, j;pivot = a[right];i = left;for (j = left; j < right; j++) {if (a[j] < pivot) {//交換值temp = a[i];a[i] = a[j];a[j] = temp;i++;}}a[right] = a[i];a[i] = pivot;return i;//把主元的下標(biāo)返回}public void quickSort(int[] a, int left, int right) {int center;if (left < right) {center = partition(a, left, right);quickSort(a, left, center - 1);//左半部分quickSort(a, center + 1, right);//右半部分}} }

2、分割操作雙向掃描

private int partition2(int[] a, int left, int right) {int i, j;int pivot = a[left];i = left + 1;j = right;while (true) {//向右掃描while (i <= j && a[i] <= pivot)i++;//向左掃描while (i <= j && a[j] >= pivot)j--;if (i >= j)break;//交換int temp = a[i];a[i] = a[j];a[j] = temp;}//把a(bǔ)[j]和主元交換a[left] = a[j];a[j] = pivot;return j;}

3、因?yàn)榭焖倥判虻淖顗臅r(shí)間復(fù)雜度是O(n2)。例如有可能會(huì)出現(xiàn)一種極端的情況,每次分割的時(shí)候,主元左邊的元素個(gè)數(shù)都為0,而右邊都為n-1個(gè)。這個(gè)時(shí)候,就需要分割n次了。而每次分割整理的時(shí)間復(fù)雜度為O(n),所以最壞的時(shí)間復(fù)雜度為O(n2)。而最好的情況就是每次分割都能夠從數(shù)組的中間分割了,這樣分割logn次就行了,此時(shí)的時(shí)間復(fù)雜度為O(nlogn)。而平均時(shí)間復(fù)雜度,則是假設(shè)每次主元等概率著落在數(shù)組的任意位置,最后算出來的時(shí)間復(fù)雜度為O(nlogn),至于具體的計(jì)算過程,我就不展開了。

//隨機(jī)選取主元的方法,為了降低極端情況出現(xiàn)的可能性,我們可以隨機(jī)選取主元,而不是固定一個(gè)位置選取。 int random_partition(int[] arr, int left, int right) {i = random(left, right);//隨機(jī)選取一個(gè)位置//在把這個(gè)位置的元素與ar[left]交換swap(arr[i], arr[left]);return partition(arr, left, right); }

總結(jié)

以上是生活随笔為你收集整理的快速排序的实现及优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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