zoukankan      html  css  js  c++  java
  • 快速排序c++/c实现

    在lintcode刷题目的时候,遇到了下面的题目

    在数组中找到第k大的元素

    给出数组 [9,3,2,4,8],第三大的元素是 4

    给出数组 [1,2,3,4,5],第一大的元素是 5,第二大的元素是 4,第三大的元素是 3,以此类推

    于是乎,复习了一下快速排序.

    //快速排序的代码实现
    // 12,56,72,1,5, 35,74,44,63,52
    // 1 5 12 35 44   52 56 63 72 74

    //使用快排的思路
    //  12 56 72 1 5 35 74 44 63 52
    //  设置两个标志 i和j,分别指向数组的开始和结束. i = 0 , j = 9;
    //    首先是去排12的位置 , 从右侧开始 ,找小的
    //  12 > 1 交换  且左侧标记i++
    //    5 56 72 1 12 35 74 44 63 52
    //  从左侧开始,找大的,56 > 12 ,则交换位置,且j--
    //  5 12 72 1 56 35 74 44 63 52
    //  从右侧找小的 , 1 <12 ,交换两个位置,且i++
    //  5 1 72  12 56 35 74 44 63 52
    //  从左侧找大的, 72 > 12 ,交换位置,j--;
    //  5 1 12 72 56 35 74 44 63 52
    //  当前i = 3 ,j = 3 ,第一趟排序完成.
    //  12 被排到了 2的位置上, 之后对0 - 1和 3 - 9递归调用快排

      1 #include <iostream>
      2 #include <unistd.h>
      3 using namespace std;
      4 
      5 
      6 
      7 void quicksort(int a[],int s,int e);
      8 int SearchByQuickSort(int a[],int s,int e,int k);
      9 
     10 int main()
     11 {
     12     int arr[10] = {12,56,72,1,5, 35,74,44,63,52};
     13     quicksort(arr,0,9);
     14     for(int i = 0;i<10;i++)
     15     {
     16         cout << arr[i] << "	" ;
     17     }
     18     cout <<endl;
     19     for(int i=0;i<10;i++)
     20     {
     21         int tmp5 = SearchByQuickSort(arr,0,9,i);
     22         cout << tmp5 <<"	";
     23     }
     24     cout <<endl;
     25 }
     26 
     27 void quicksort(int a[],int s,int e)
     28 {
     29     //递归的返回
     30     if(s == e)
     31     {
     32         return ;
     33     }
     34     int i,j;
     35     int port = 0;   //1表示左端 0表示右端
     36     int key = a[s];
     37     int NumKey = s;
     38     for(i = s,j = e;i != j;){
     39         if(port == 0){
     40             if(a[j] < key){
     41                 cout << a[j] << " << " << key <<endl;
     42                  a[NumKey] = a[j];
     43                  NumKey = j;
     44                  port = 1;
     45                  i++;
     46             }
     47             else{
     48                 j--;
     49             }
     50         }
     51         else{
     52             if(a[i] > key){
     53                 cout << a[i] << " << " << key <<endl;
     54                  a[NumKey] = a[i];
     55                  NumKey = i;
     56                  port = 0;
     57                  j--;
     58             }
     59             else{
     60                 i++;
     61             }
     62         }
     63     }
     64     a[NumKey] = key;
     65     //通过递归排序去排剩下的.
     66     
     67     if(NumKey == s)
     68     {
     69         quicksort(a,NumKey+1,e);
     70     }
     71     else if(NumKey == e)
     72     {
     73         quicksort(a,s,NumKey-1);
     74     }
     75     else
     76     {
     77         quicksort(a,NumKey+1,e);
     78         quicksort(a,s,NumKey-1);
     79     }    
     80 }
     81 
     82 int SearchByQuickSort(int a[],int s,int e,int k)
     83 {
     84     //递归的返回
     85     if(s == e)
     86     {
     87         if(k == e)
     88         {
     89             return a[e];
     90         }
     91         else
     92         {
     93             return 0;
     94         }
     95     }
     96     int i,j;
     97     int port = 0;   //1表示左端 0表示右端
     98     int key = a[s];
     99     int NumKey = s;
    100     for(i = s,j = e;i != j;){
    101         if(port == 0){
    102             if(a[j] < key){
    103                 cout << a[j] << " << " << key <<endl;
    104                  a[NumKey] = a[j];
    105                  NumKey = j;
    106                  port = 1;
    107                  i++;
    108             }
    109             else{
    110                 j--;
    111             }
    112         }
    113         else{
    114             if(a[i] > key){
    115                 cout << a[i] << " << " << key <<endl;
    116                  a[NumKey] = a[i];
    117                  NumKey = i;
    118                  port = 0;
    119                  j--;
    120             }
    121             else{
    122                 i++;
    123             }
    124         }
    125     }
    126     a[NumKey] = key;
    127     if(NumKey == k)
    128     {
    129         return a[NumKey];
    130     }
    131     //通过递归排序去排剩下的.
    132     
    133     int x = 0;
    134     if(NumKey == s)
    135     {
    136         x = SearchByQuickSort(a,NumKey+1,e,k);
    137     }
    138     else if(NumKey == e)
    139     {
    140         x = SearchByQuickSort(a,s,NumKey-1, k);
    141     }
    142     else
    143     {
    144         x = SearchByQuickSort(a,NumKey+1,e,k);
    145         x += SearchByQuickSort(a,s,NumKey-1,k);
    146     }
    147     return x;    
    148 }




  • 相关阅读:
    Android桌面快捷方式的实现
    Java之currenHashMap
    windows 2003 配置邮件服务器 hMailServer+squirrelmail
    bat脚本 cmd 命令
    强制客户端更新Silverlight XAP文件方法汇总(转)
    Silverlight 常用StringFormat格式总结(转)
    Excel 操作 DLL
    silverlight 开发软件列表
    通用错误处理
    use XSD.exe in VS2010 from a xsd file to class
  • 原文地址:https://www.cnblogs.com/qiny1012/p/8424604.html
Copyright © 2011-2022 走看看