快速排序的思想进行划分搜索。

 数据结构课的作业;

下面是原题:

对给定关键字(假设所有关键字均不相等)的序号j(0《j《n),要求在无序记录A[0..n - 1]中找到按关键字从小到大排在第j位上的记录,是利用快排划分思想设计算法实现上述查找。


 

Code:
  1. /** 
  2.  * @brief 快速查找 
  3.  * @Author 朱凯迪 & 林莹莹 
  4.  */  
  5. #include <iostream>  
  6. using namespace std;  
  7.   
  8. namespace sort  
  9. {  
  10. struct sortstru {  
  11.     int data;  
  12.     int pos;  
  13. };  
  14.   
  15. int _qsearch(const sortstru *tot_op, sortstru *op, sortstru *ed, int n)  
  16. {  
  17.     sortstru *mid = op + ((ed - op) >> 1);                  ///< 中位数  
  18.     int mid_num = mid->data;                                ///< 中位数的值  
  19.     sortstru *i = op, *j = ed;                              ///< i和j  
  20.     sortstru tmp;                                           ///< 用于交换的变量  
  21.     if(op == ed && op - tot_op == n - 1) return op->pos;  
  22.     else  
  23.     if(op == ed) return -1;  
  24.   
  25.     do {  
  26.         while(i->data < mid_num) i++;  
  27.         while(j->data > mid_num) j--;  
  28.         if(i <= j)  
  29.         {  
  30.             tmp = *i;  
  31.             *i = *j;  
  32.             *j = tmp;  
  33.             i++;  
  34.             j--;  
  35.         }  
  36.     }while(i <= j);  
  37.   
  38.     if(i - j > 1)                                           ///< 若有有序区间  
  39.         if(i > tot_op + n - 1 && j < tot_op + n - 1)        ///< 若在有序区间内  
  40.             return (tot_op + n - 1)->pos;                   ///< 返回答案  
  41.   
  42.     if(j >= tot_op + n - 1) _qsearch(tot_op, op, j, n);     ///< 排序下一区间  
  43.     else  
  44.     if(i <= tot_op + n - 1) _qsearch(tot_op, i, ed, n);     ///< 排序下一区间  
  45. }  
  46.   
  47. int QSearch(const int A[], int tot, int j)  
  48. {  
  49.     if(j > tot) return -1;  
  50.     sortstru *_a = new sortstru[tot];                       ///< 排序结构体对象数组  
  51.     for(int i = 0; i < tot; i++)                            ///< 初始化数组  
  52.         _a[i].data = A[i], _a[i].pos = i;  
  53.     int ans = _qsearch(_a, _a, _a + tot - 1, j);            ///< 寻找第j大数  
  54.     delete _a;                                              ///< 释放地址  
  55.   
  56.     return ans;                                             ///< 返回结果  
  57. }  
  58. }  
  59.   
  60. int main()  
  61. {  
  62.     /** A Demo for QSearch by Zhu Kaidi & Lin Yingying */  
  63.     int A[] = { 2, 4, 5, 1, 8, 6, 0, 3, 7, 9 };  
  64.   
  65.     printf("原数组: ");  
  66.     for(int i = 0; i < 10; i++) printf("%4d", A[i]);  
  67.     printf("/n");  
  68.   
  69.     /** A: 数组, 10: 数组长度, 4: 第4大数 */  
  70.     int ans = sort::QSearch(A, 10, 7);  
  71.     printf("第四大的数排在第%d位:%d/n", ans, A[ans]);  
  72.   
  73.     return 0;  
  74. }  

 


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值