• 快速排序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 }




  • 相关阅读:
    出自 HTML4 规范的可用颜色字符串值列表(常用颜色名称及对应的十六进制值)
    HTML5 Canvas 八星聚义动态效果
    HTML5 Canvas 绘制澳大利亚国旗
    HTML5 Canvas 绘制新西兰国旗
    HTML5 Canvas 绘制加拿大枫叶旗
    HTML5 Canvas 绘制英国国旗
    HTML5 Canvas 绘制星条旗
    当类中的方法全部都是 static 关键字修饰时 ,它的构造方法最好作为 private 私有化,理由是方法全是 static, 不知道的人会去new对象去调用,需要调用构造方法。 但 static的方法直接用类名调用就行!
    【Java面试复习经典】传智播客Java就业班入学测试题及答案解析(2014年版)
    【Java面试复习经典】传智播客Java就业班入学测试题及答案解析(2012年版)
  • 原文地址:https://www.cnblogs.com/qiny1012/p/8424604.html
Copyright © 2020-2023  润新知