快速排序思想的應用–求數組中第k小的數

來源:互聯網
上載者:User

1問題定義

  加入數組arr中資料是:4,0,1,0,2,3,那麼第三小的元素是1,問怎麼樣快速的求出這個第k小的數。

2.解決方案

解法一:

  利用STL中快速排序把數組進行排序,然後數組下標是k-1的就是我們要求的第k小的元素了,這種情況的時間複雜度接近於O(n*logn)。但是回頭想一想這個演算法是把數組進行了全排序,而我們只是要找到數組中第k小的數,這顯然是“殺豬用了牛刀”。當然了時間複雜度較高也是正常的。

解法二:

  想一想快速排序的思想:將數組中某一個元素m作為劃分依據(我們假設為第一個元素,即m = arr[0]),遍曆一遍數組,使得數組的格局變成這樣的三個部分:(1)m前面的元素 (2)m  (3)m後面的元素。其中m前面的元素小於m,m後面的元素大於m,這樣找第k小的數正好可以借鑒這個思想,即:

1、若m前面的元素個數大於k,則第k小的數一定在m前面的元素中,這時我們只需要繼續在m前面的元素中搜尋第k小的數;

2、若m前面的元素個數小於k,則第k小的數一定在m後面的元素中,這是我們只需要繼續在m後面的元素中搜尋第k-s小的數,其中s是m前面的元素個數。

下面給出代碼:(在vc6.0下測試)

 

 1 #include <iostream.h> 2  3 #define MAX_SIZE 100 4  5 int Biger[MAX_SIZE]; 6 int Smaller[MAX_SIZE]; 7  8 int Select_kth_Small(int arr[],int n,int k) 9 {10     if(n == 1)11         return arr[0];12     int b = 0,s = 0,t = arr[0],temp_n,temp_k;13     int temp[MAX_SIZE];14     for(int i = 1 ; i < n ; i++)//遍曆集合15     {16         if(arr[i] > t)17             Biger[b++] = arr[i]; //如果當前元素比t大,就將當前元素加入Biger[]18         else19             Smaller[s++] = arr[i];//反之就加入到Smaller,這裡沒有考慮set[0]20     }21     if(b == 0)22     {23         Biger[b++] = t;//if...else主要是為了防止t大於或小於其他所有元素的情況24     }25     else26     {27         Smaller[s++] = t;28     }29     //如果Smaller集合中的元素個數大於K,說明第K小的元素必在其中30     //否則一定在Biger中,且應該是Biger集合中第k-r小的元素31     //更新相應的變數32     if(s >= k)33     {34         temp_n = s;35         temp_k = k;36         for(i=0;i<temp_n;i++)37         {        38             temp[i] = Smaller[i];39         }40     }        41     else42     {43         temp_n = b;44         temp_k = k-s;45         for(i=0;i<temp_n;i++)46         {47             temp[i]=Biger[i];    48         }49     }50     return Select_kth_Small(temp,temp_n,temp_k);51 }52 53 int main()54 {55     int arr[]={4,0,1,0,2,3};56     int ans = Select_kth_Small(arr,6,3);57     cout<<"在數組arr[]={4,0,1,0,2,3}中,第3小的數是:"<<ans<<endl;58     return 0;59 }

 

這個代碼多用了較多的輔助空間,為的是不改變原來的數組的元素的順序。不知道這個代碼有什麼漏洞沒有,大家幫幫找找。謝謝嘍……

學習中的一點總結,歡迎拍磚哦^^

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.