利用快排查询无序数组第k位大的数
生活随笔
收集整理的這篇文章主要介紹了
利用快排查询无序数组第k位大的数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
由于快速排序的partion函數返回值是基準值最終的位置,由此可以啟發得出當這個位置剛好是第k位時,直接輸出它下標對應的值,如果這個位置大于第k位時,則向該基準位置的左邊遞歸;如果這個位置小于第k位時,則向該基準位置的右邊遞歸;以上就是查找第k位的基本思想。
這個算法時間復雜度是o(n),這時候有的人會說快排的時間復雜度是o(nlogn),為什么這個是o(n)呢?因為快排分別是對基準值兩邊進行遞歸操作的,然后再合并,合并操作時間復雜度o(1),每趟進行了n次交換,整個快速排序進行了logn趟,所以快速排序的時間復雜度是o(nlogn);而這個查找問題,它只需要每次在一邊查找,確定樞紐元的相對位置(在K的左邊或者右邊)之后不用再對剩下的一半進行處理。也就是說第二次插入的算法復雜度不再是O(N)而是O(N/2),它的時間復雜度求解過程是1+1/2+1/4+........ < 2[1-(1/2)^n]<2,換句話說就是一共是O(2N)的算法復雜度也就是O(N)的算法復雜度。
源碼(python)
def partion(arr,left,right):front=leftrear=righttemp=arr[left]while(rear>front):while(rear>front) and(arr[rear]>temp):rear-=1arr[front]=arr[rear]while(rear>front) and(arr[front]<=temp):front+=1arr[rear]=arr[front]arr[front]=tempreturn frontdef main(arr,left,right,k):if(left==right): #當只有一個數時return arr[left]if(k-left+1>right): #當給出的k超過最大的數組時return -1t=partion(arr,left,right) #返回的是基準值在數組的位置,需要加1才等于第幾位if (t+1==k): #因為數組是從0開始,所以需要t+1才能與k值判斷return arr[t]elif(t+1>k): #當t+1大于k時,說明第k位在基準值的左邊return main(arr,left,t-1,k)else: #當t+1小于k時,說明第k位在基準值的右邊return main(arr,t+1,right,k)arr=[1,3,4,2,6,5,8,7,9,10] print(main(arr,0,9,6))c語言源碼:
#include<stdio.h> int p; int t; void swap(int a[],int m,int n){int temp;temp=a[m];a[m]=a[n];a[n]=temp; } int partion(int a[],int left,int right){int k=left;int s=a[k]; //將中間的這個數和第一個數交換 while(left<right){while(left<right&&a[right]>s){ // 從右向左找第一個小于x的數 right--;}swap(a,right,left);while(left<right&&a[left]<=s){ // 從左向右找第一個大于等于x的數 left++;}swap(a,left,right);}a[left]=s; //一趟劃分結束,left為軸心return left; } int quick_find(int a[],int left,int right,int k){if(k<0 && k-left+1>right){return -1;}if(left==right) return a[left];int t=partion(a,left,right);if(t+1==k) return a[t]; //基準值的位置剛好是第k位else if(t+1>k) //向基準值左邊遞歸查找return quick_find(a,left,t-1,k);else //向基準值右邊遞歸查找return quick_find(a,t+1,right,k); }int main(){int a[]={1,2,5,7,4,3,10,6,9,8};int u=9;int k=5;printf("%d\n",quick_find(a,0,u,k));return 0; }?
總結
以上是生活随笔為你收集整理的利用快排查询无序数组第k位大的数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快速排序的解析
- 下一篇: 汽车穿越沙漠的算法问题(反推法)