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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

快速排序quicksort算法优化

發(fā)布時間:2024/7/5 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快速排序quicksort算法优化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.基本想想

  • 快速排序使用分治的思想

  • 通過一趟排序?qū)⒋判蛄蟹指畛蓛刹糠?#xff0c;其中一部分所有元素均比基準大,另一部分均比基準小

  • 分別對這兩部分元素繼續(xù)進行排序,以達到整個序列有序

2.快排的步驟

  • 1.選擇基準
    在待排序列中,按照某種方式挑出一個元素,作為 “基準”(pivot)
  • 2.分割操作
    在基準左邊的元素都比該基準小,在基準右邊的元素都比基準大
  • 3.遞歸
    遞歸地對兩個序列進行快速排序,直到序列為空或者只有一個元素

3.基準的選取

  • 固定位置
    取序列的第一個或最后一個元素作為基準
int pval = arr[left];
  • 隨機選取基準
    取待排序列中任意一個元素作為基準
int pval = arr[rand()%(right-left)+left];
  • 三數(shù)取中
    對待排序序列中l(wèi)ow、mid、high三個位置上數(shù)據(jù)進行排序,取他們中間的那個數(shù)據(jù)作為樞軸
void selectmedianofthree(int *arr, size_t left, size_t right) {size_t mid = left + (right - left)/2; //中部數(shù)據(jù)的下標if(arr[mid]>arr[right]){swap(arr[mid],arr[right]);}if(arr[left]>arr[right]){swap(arr[left],arr[right]);}if(arr[mid]>arr[left]){swap(arr[mid],arr[left]); //把中間大小的數(shù)值放到首位,取為基準} }

4.快排算法優(yōu)化

  • 當待排序序列的長度分割到一定大小后,使用插入排序或者其它排序(數(shù)組短的時候,快排分割效率不高)
if(left >= right){return;}else if(right-left > 0 && right-left < 20) //數(shù)組長度較小時,調(diào)用希爾排序,減少調(diào)用快排{size_t len = right - left + 1;shellsort(len, &arr[left]); //數(shù)組首地址為&arr[left]}else{qsort(****);}
  • 在一次分割結(jié)束后,可以把與基準p相等的元素聚在一起,繼續(xù)下次分割時,不用再對與基準p相等元素分割
void partion(int *arr, size_t left, size_t right, size_t &lessPnum, size_t &largePnum)//數(shù)據(jù)分段 {selectmedianofthree(arr,left,right); //找出中間大小的哨兵,讓分段盡量均勻,提高效率int pval = arr[left]; //中間大小的數(shù)賦值給哨兵int *temp = new int [right-left+1]; //開辟堆空間存放臨時數(shù)組int tempLindex=0, tempRindex = right-left; //臨時數(shù)組的首末位下標for(int i = left+1; i <= right; ++i){if(pval > arr[i]) //比哨兵小的放在左邊,從左邊首位往中間寫入,記錄下比哨兵小的有多少個{temp[tempLindex++] = arr[i];++lessPnum;}if(pval < arr[i]) 比哨兵大的放在右邊,從右邊末位中間寫入,記錄下比哨兵大的有多少個{temp[tempRindex--] = arr[i];largePnum++;}}for( ; tempLindex <= tempRindex; ++tempLindex)//中間還未被寫入的位置,寫入哨兵(哨兵可能是多個相同的值){temp[tempLindex] = pval;}for(int i = left, j=0; i <= right; ++i){arr[i] = temp[j++]; //把分好段的數(shù)組寫回原數(shù)組{ [小于哨兵的], [等于哨兵的], [大于哨兵的] }}delete [] temp; //釋放臨時數(shù)組temp = NULL; //指針置空 }

5.效率比較

同樣的環(huán)境下,運行時間(s)

參考文獻

https://blog.csdn.net/hacker00011000/article/details/52176100

總結(jié)

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

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