`
kenby
  • 浏览: 725416 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

快速排序 顺序统计量 数组分割

 
阅读更多
#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;
}
分享到:
评论

相关推荐

    字符的快速排序算法(12KB)

    通常,快速排序的实现并不需要大量的代码,其核心在于如何选择基准元素和分割数组。 标签中的"控件"可能意味着这个算法是在某种用户界面环境中实现的,例如在Visual Basic(VB)这样的编程环境中。"源码"表示我们有...

    按照字母顺序进行排序

    对于“按照字母顺序进行排序”,这些算法都可以实现,但在实际应用中,由于字符串的特殊性,通常会选择效率更高的算法,如快速排序或归并排序。 四、编程语言实现 在不同的编程语言中,都有内置的排序函数可以方便...

    排序算法(好多种,值得研究)

    快速排序是一种高效的排序算法,通过选择一个“基准”值进行分割,并递归地排序左右两侧的子序列来实现。 4. **分配排序**: - 基于元素值的范围将数据分配到不同的桶中,然后对每个桶中的元素进行排序。这种方法...

    《算法导论》完整的课件下载

    本次讨论的重点在于书中提到的顺序统计量(Order Statistics)算法,这是一种找出数组中第i小元素的有效方法。 #### 二、顺序统计量算法介绍 ##### 1. 基本概念 顺序统计量问题指的是在未排序数组中找到第i小的...

    堆排序,快排,希尔,桶排,插入,归并,计数,选择排序

    其基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成...

    【数据结构】内部排序的比较

    - **快速排序**:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行。 - **希尔排序*...

    MIT算法导论公开课之课程笔记 5.线性时间排序.rar

    4. 返回结果数组,此时已按照输入数组的元素频率顺序排序。 然而,计数排序并不适用于所有情况。当输入数据的范围很大或者包含负数时,它就不再适用,因为它需要创建一个与数据范围相同的计数数组,这可能导致内存...

    数据结构中几种常用的排序算法总结

    - **实现原理**:采用分治策略,将数组分割成两半,分别排序后再合并。 ##### 5. 堆排序 (Heap Sort) - **时间复杂度**:O(nlogn)。 - **空间复杂度**:O(1),原地排序。 - **稳定性**:不稳定。 - **实现原理**:...

    并行计算排序方法.pptx

    1. **分解**:将原始输入数组分割成若干较小的子数组,这些子数组可以在不同的处理器上并行进行归并排序。 2. **合并**:对已经排序完成的子数组进行合并,最终得到一个完全有序的数组。 3. **优化**: - **工作...

    数据结构课程设计

    **适用场景**:适用于小数据量排序,或是作为其他排序算法(如快速排序、堆排序)的一部分,处理小规模子数组。 ##### 4. 快速排序(Quick Sort) **基本思想**:快速排序使用分而治之的策略来把一个串行(list)...

    第6课 统计数字——归并排序(count)-2020.04.11.pdf

    - 在合并过程中,使用额外的辅助数组`b`,将原数组`a`中的元素按照顺序依次放入`b`,然后再将`b`中的有序元素赋回给`a`。 3. **时间复杂度**: - 归并排序的时间复杂度为O(nlog2n),这是在最坏、最好和平均情况下...

    基本算法模块.doc

    - **希尔排序**:希尔排序是插入排序的一种更高效的改进版本,通过增量序列将待排序的数组分割成若干子序列,然后对子序列进行插入排序,最后进行一次整体插入排序,时间复杂度在最好情况下可以达到O(n log n),但...

    一本 c和数据结构

    另外,对于排序后的数据,可以更快速高效地执行某些操作。例如,如果数据已经排序,则可以使用二分查找来进行搜索,这种方法比顺序查找快得多。同时,合并两个独立的项目列表也更容易,前提是这些列表已经被排序。 ...

    Array-Algorithms:用于在python中进行简单操作的数组算法的集合

    排序算法用于将数组中的元素按照特定顺序排列,对于大数据集,高效的排序算法如快速排序和归并排序更有优势。 2. **搜索算法**:包括线性搜索(Linear Search)、二分查找(Binary Search)等。这些算法用于在数组...

    一个程序员,一生必须掌握的几种算法.doc

    使用快速排序,我们可以将成绩单拆分为两个部分,然后通过递归方式不断将数据分割下去,直到每个子列表只有一个元素。最后将各个子列表中的最高成绩进行比较,找出整体最高成绩。 二、搜索算法 搜索算法是一种能够...

    算法导论(第二版)答案免费下载

    8. **第9章:中位数与顺序统计量** - 介绍了如何找到数组中的第k小元素,以及相关的算法设计思路。 9. **第11章:哈希表** - 介绍了哈希表的工作原理、哈希函数的设计方法以及解决冲突的技术。 10. **第12章:二叉...

    程序员必知的十大基础实用算法及其讲解

    ### 知识点一:快速排序算法 **定义与特性:** 快速排序是一种高效的排序算法,由东尼·霍尔提出。它采用分治法策略,通过递归地将一个序列划分为两个较小的子序列来进行排序。快速排序在平均情况下的时间复杂度为O...

    计算机二级公共基础知识

    下一节排序中,有序的含义也是如此。 对于长度为n的有序线性表,利用二分法查找元素X的过程如下: 步骤1:将X与线性表的中间项比较; 步骤2:如果X的值与中间项的值相等,则查找成功,结束查找; 步骤3:如果X小于...

    通信计算机网络面试题(c/c++)

    - **原理**:快速排序法通过选择一个基准元素,将数据分为小于基准和大于基准的两部分,然后递归地对这两部分进行排序。 ### 35. 合并排序法 (Merge Sort) **说明**:合并排序法是一种稳定的排序算法,通过分治...

    《算法最优解(第一版)》剑指Offer题解校招求职刷题必备.docx

    6. **最小化的数组表示**:将数组元素重新排列使得结果字符串最小,需要考虑数字大小和排列顺序的影响,可以使用排序和字符串拼接的方法。 7. **数组中只出现一次的数**:找出数组中唯一出现一次的数,可以使用异或...

Global site tag (gtag.js) - Google Analytics