数据结构课的作业;
下面是原题:
对给定关键字(假设所有关键字均不相等)的序号j(0《j《n),要求在无序记录A[0..n - 1]中找到按关键字从小到大排在第j位上的记录,是利用快排划分思想设计算法实现上述查找。
- /**
- * @brief 快速查找
- * @Author 朱凯迪 & 林莹莹
- */
- #include <iostream>
- using namespace std;
- namespace sort
- {
- struct sortstru {
- int data;
- int pos;
- };
- int _qsearch(const sortstru *tot_op, sortstru *op, sortstru *ed, int n)
- {
- sortstru *mid = op + ((ed - op) >> 1); ///< 中位数
- int mid_num = mid->data; ///< 中位数的值
- sortstru *i = op, *j = ed; ///< i和j
- sortstru tmp; ///< 用于交换的变量
- if(op == ed && op - tot_op == n - 1) return op->pos;
- else
- if(op == ed) return -1;
- do {
- while(i->data < mid_num) i++;
- while(j->data > mid_num) j--;
- if(i <= j)
- {
- tmp = *i;
- *i = *j;
- *j = tmp;
- i++;
- j--;
- }
- }while(i <= j);
- if(i - j > 1) ///< 若有有序区间
- if(i > tot_op + n - 1 && j < tot_op + n - 1) ///< 若在有序区间内
- return (tot_op + n - 1)->pos; ///< 返回答案
- if(j >= tot_op + n - 1) _qsearch(tot_op, op, j, n); ///< 排序下一区间
- else
- if(i <= tot_op + n - 1) _qsearch(tot_op, i, ed, n); ///< 排序下一区间
- }
- int QSearch(const int A[], int tot, int j)
- {
- if(j > tot) return -1;
- sortstru *_a = new sortstru[tot]; ///< 排序结构体对象数组
- for(int i = 0; i < tot; i++) ///< 初始化数组
- _a[i].data = A[i], _a[i].pos = i;
- int ans = _qsearch(_a, _a, _a + tot - 1, j); ///< 寻找第j大数
- delete _a; ///< 释放地址
- return ans; ///< 返回结果
- }
- }
- int main()
- {
- /** A Demo for QSearch by Zhu Kaidi & Lin Yingying */
- int A[] = { 2, 4, 5, 1, 8, 6, 0, 3, 7, 9 };
- printf("原数组: ");
- for(int i = 0; i < 10; i++) printf("%4d", A[i]);
- printf("/n");
- /** A: 数组, 10: 数组长度, 4: 第4大数 */
- int ans = sort::QSearch(A, 10, 7);
- printf("第四大的数排在第%d位:%d/n", ans, A[ans]);
- return 0;
- }