#include <stdio.h>
#include <string.h>
#define N 2578
void swap(int *p, int *q)
{
int tmp;
tmp = *p;
*p = *q;
*q = tmp;
}
int partition(int *a, int s, int t)
{
int pv = a[t];
while(s < t) {
for (; s < t && a[s] < pv; s++);
swap(a+s, a+t);
for (; t > s && a[t] > pv; t--);
swap(a+t, a+s);
}
return s;
}
/* 选择数组中第i大的元素并返回 */
int quick_select(int *a, int s, int t, int i)
{
int p, m;
if (s == t) return a[t];
p = partition(a, s, t); /* 用a[t]分割数组 */
m = p - s + 1; /* m是a[t]在小组内的排名 */
if (m == i) return a[p];
if (m > i) {
return quick_select(a, s, p-1, i);
}
return quick_select(a, p+1, t, i-m);
}
void quick_sort(int *a, int s, int t)
{
int p;
if (s < t) {
p = partition(a, s, t);
quick_sort(a, s, p-1);
quick_sort(a, p+1, t);
}
}
int main()
{
int i;
int a[N+1];
for (i = 0; i <= N; i++) {
a[i] = N-i;
}
quick_sort(a, 0, N);
printf("第%d大的数为%d\n", 2, quick_select(a, 0, N, 2));
return 0;
}
分享到:
相关推荐
通常,快速排序的实现并不需要大量的代码,其核心在于如何选择基准元素和分割数组。 标签中的"控件"可能意味着这个算法是在某种用户界面环境中实现的,例如在Visual Basic(VB)这样的编程环境中。"源码"表示我们有...
对于“按照字母顺序进行排序”,这些算法都可以实现,但在实际应用中,由于字符串的特殊性,通常会选择效率更高的算法,如快速排序或归并排序。 四、编程语言实现 在不同的编程语言中,都有内置的排序函数可以方便...
快速排序是一种高效的排序算法,通过选择一个“基准”值进行分割,并递归地排序左右两侧的子序列来实现。 4. **分配排序**: - 基于元素值的范围将数据分配到不同的桶中,然后对每个桶中的元素进行排序。这种方法...
本次讨论的重点在于书中提到的顺序统计量(Order Statistics)算法,这是一种找出数组中第i小元素的有效方法。 #### 二、顺序统计量算法介绍 ##### 1. 基本概念 顺序统计量问题指的是在未排序数组中找到第i小的...
其基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成...
- **快速排序**:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行。 - **希尔排序*...
4. 返回结果数组,此时已按照输入数组的元素频率顺序排序。 然而,计数排序并不适用于所有情况。当输入数据的范围很大或者包含负数时,它就不再适用,因为它需要创建一个与数据范围相同的计数数组,这可能导致内存...
- **实现原理**:采用分治策略,将数组分割成两半,分别排序后再合并。 ##### 5. 堆排序 (Heap Sort) - **时间复杂度**:O(nlogn)。 - **空间复杂度**:O(1),原地排序。 - **稳定性**:不稳定。 - **实现原理**:...
1. **分解**:将原始输入数组分割成若干较小的子数组,这些子数组可以在不同的处理器上并行进行归并排序。 2. **合并**:对已经排序完成的子数组进行合并,最终得到一个完全有序的数组。 3. **优化**: - **工作...
**适用场景**:适用于小数据量排序,或是作为其他排序算法(如快速排序、堆排序)的一部分,处理小规模子数组。 ##### 4. 快速排序(Quick Sort) **基本思想**:快速排序使用分而治之的策略来把一个串行(list)...
- 在合并过程中,使用额外的辅助数组`b`,将原数组`a`中的元素按照顺序依次放入`b`,然后再将`b`中的有序元素赋回给`a`。 3. **时间复杂度**: - 归并排序的时间复杂度为O(nlog2n),这是在最坏、最好和平均情况下...
- **希尔排序**:希尔排序是插入排序的一种更高效的改进版本,通过增量序列将待排序的数组分割成若干子序列,然后对子序列进行插入排序,最后进行一次整体插入排序,时间复杂度在最好情况下可以达到O(n log n),但...
另外,对于排序后的数据,可以更快速高效地执行某些操作。例如,如果数据已经排序,则可以使用二分查找来进行搜索,这种方法比顺序查找快得多。同时,合并两个独立的项目列表也更容易,前提是这些列表已经被排序。 ...
排序算法用于将数组中的元素按照特定顺序排列,对于大数据集,高效的排序算法如快速排序和归并排序更有优势。 2. **搜索算法**:包括线性搜索(Linear Search)、二分查找(Binary Search)等。这些算法用于在数组...
使用快速排序,我们可以将成绩单拆分为两个部分,然后通过递归方式不断将数据分割下去,直到每个子列表只有一个元素。最后将各个子列表中的最高成绩进行比较,找出整体最高成绩。 二、搜索算法 搜索算法是一种能够...
8. **第9章:中位数与顺序统计量** - 介绍了如何找到数组中的第k小元素,以及相关的算法设计思路。 9. **第11章:哈希表** - 介绍了哈希表的工作原理、哈希函数的设计方法以及解决冲突的技术。 10. **第12章:二叉...
### 知识点一:快速排序算法 **定义与特性:** 快速排序是一种高效的排序算法,由东尼·霍尔提出。它采用分治法策略,通过递归地将一个序列划分为两个较小的子序列来进行排序。快速排序在平均情况下的时间复杂度为O...
下一节排序中,有序的含义也是如此。 对于长度为n的有序线性表,利用二分法查找元素X的过程如下: 步骤1:将X与线性表的中间项比较; 步骤2:如果X的值与中间项的值相等,则查找成功,结束查找; 步骤3:如果X小于...
- **原理**:快速排序法通过选择一个基准元素,将数据分为小于基准和大于基准的两部分,然后递归地对这两部分进行排序。 ### 35. 合并排序法 (Merge Sort) **说明**:合并排序法是一种稳定的排序算法,通过分治...
6. **最小化的数组表示**:将数组元素重新排列使得结果字符串最小,需要考虑数字大小和排列顺序的影响,可以使用排序和字符串拼接的方法。 7. **数组中只出现一次的数**:找出数组中唯一出现一次的数,可以使用异或...