`
xidajiancun
  • 浏览: 454443 次
文章分类
社区版块
存档分类
最新评论

排序算法c语言描述-快速排序随机化

 
阅读更多

今天在做数据结构排序实验的时候,使用的快速排序。按理,我印象中快排是很高效的,不过,这次400w的数据,排了2659秒,有点意想不到,让我一度怀疑了算法是否写错了。

不过,认真分析,认真想想后, 也就释然了。


快排其实就是冒泡的升级版。

每次递归,把当前序列分成两部分,一个比枢纽元素大,一个比枢纽元素小。具体思想可以参见的之前写的一篇博客。

http://blog.csdn.net/hitwhylz/article/details/9968639


至于这次实验的低效,我看了下所给的数据,发现序列基本有序,从20-------3999997

排列的很有规则,就移动了些许位置, 但是保持递增趋势。

这样的序列使用常规快排,那就体现不出快排的优势了。 因为每次选取的时候都是采用子序列的第一个元素为枢纽元素 int pivot = array[low];

这样导致每次比较,分出的序列差别都很大,以至于需要递归很多次。


为解决这问题,采用了快速排序随机化方法,即每次确定的枢纽元素都是随机找出的。

一般来说随机选取枢纽元这种策略非常安全,除非随机数生成器有问题(这不像你所想象的那么罕见),因为随机的枢纽元不可能总在接连不断地产生劣质的分割。


下面具体看代码了。


#include "stdio.h"
#include "math.h"
#include "stdlib.h"

int num = 10;

void swap(int *a,int *b)
{
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}

void PrintArray(int arr[])
{
    int i;
	for(i=0; i < num; ++i)
	{
	    printf("%d ", arr[i]);
	}
}

int Partition(int *arr, int beg, int end)
{
    int j;
	int sentinel = arr[end];
	int i = beg-1;
	for(j=beg; j <= end-1; ++j)
	{
		if(arr[j] <= sentinel)
		{
			i++;
			swap(&arr[i], &arr[j]);
		}
	}
	swap(&arr[i+1], &arr[end]);

	printf("\n排序过程:");
	PrintArray(arr);
	return i+1;
}

int RandomPartition(int *arr, int beg, int end)
{
	int i = beg + rand() % (end-beg+1);
	swap(&arr[i], &arr[end]);
	return Partition(arr, beg, end);
}

void RandomQuickSort(int *arr, int beg, int end)
{
	if(beg < end)
	{
		int pivot = RandomPartition(arr, beg, end);
		printf("\n随机选择 arr[%d](%d)", pivot, arr[pivot]);
		RandomQuickSort(arr, beg, pivot-1);
		printf("\n随机选择 arr[%d](%d)", pivot, arr[pivot]);
		RandomQuickSort(arr, pivot+1, end);
	}
}

int main()
{
	int i;
	int arr[10];

	srand(time(0));
    for(i=0; i < 10; i++)
    {
        arr[i] = rand()%100+1;
        //printf("%d ", rand()%100+1);
    }

    printf("初始数组:");
    PrintArray(arr);

	RandomQuickSort(arr, 0, num-1);

	printf("\n最后结果:");
	PrintArray(arr);

	return 0;
}



学习的路上,与君共勉。

分享到:
评论

相关推荐

    数据结构与算法分析第二版 ---C语言描述(附加答案)

    排序7.1 预备知识7.2 插入排序7.2.1 算法7.2.2 插入排序的分析7.3 一些简单排序算法的下界7.4 希尔排序7.4.1 希尔排序的最坏情形分析7.5 堆排序7.5.1 堆排序的分析7.6 归并排序7.6.1 归并排序的分析7.7 快速排序...

    常用算法程序集(C语言描述)(第三版)+完整源代码

    常用算法程序集(C语言描述)(第三版) 清晰PDF版,配完整源代码。 第1章 多项式的计算 1.1 一维多项式求值 1.2 一维多项式多组求值 1.3 二维多项式求值 1.4 复系数多项式求值 1.5 多项式相乘 1.6 复系数多项式...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    1.1 C语言的发展过程 1.2 当代最优秀的程序设计语言 1.3 C语言版本 1.4 C语言的特点 1.5 面向对象的程序设计语言 1.6 C和C++ 1.7 简单的C程序介绍 1.8 输入和输出函数 1.9 C源程序的结构特点 1.10 书写程序...

    算法导论(part1)

    7.3 快速排序的随机化版本 7.4 快速排序分析 7.4.1 最坏情况分析 7.4.2 期望的运行时间 第8章 线性时间排序 8.1 排序算法时间的下界 8.2 计数排序 8.3 基数排序 8.4 桶排序 第9章 中位数和顺序...

    c语言经典源码例子100篇

    第一篇 基础知识篇 ...实例94 用C语言实现遗传算法 实例95 人工神经网络的C语言实现 实例96 K_均值算法 实例97 ISODATA算法 实例98 快速傅立叶变换 实例99 求解野人与传教士问题 实例100 简单专家系统

    C语言通用范例开发金典.part2.rar

    范例1-85 一趟快速排序的改进算法 248 ∷相关函数:QuickSort函数 1.5.10 简单选择排序 250 范例1-86 简单选择排序 250 ∷相关函数:SelectSort函数 1.5.11 箱子排序 252 范例1-87 箱子排序 252 ∷相关函数:...

    8. 快速排序里的学问:随机化快排1

    }程序运行结果: 初始数组:79 36 68 39 10 96 59 60 84 21 排序过程:7

    二级C语言公共基础知识

    (6) 在结构化方法中,用数据流程图(DFD)作为描述工具的软件开发阶段是______。(B) A. 可行性分析 B. 需求分析 C. 详细设计 D. 程序编码 (7) 在软件开发中,下面任务不属于设计阶段的是______。(D) A. 数据结构...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    1.1 C语言的发展过程 1.2 当代最优秀的程序设计语言 1.3 C语言版本 1.4 C语言的特点 1.5 面向对象的程序设计语言 1.6 C和C++ 1.7 简单的C程序介绍 1.8 输入和输出函数 1.9 C源程序的结构特点 1.10 书写程序...

    C语言通用范例开发金典.part1.rar

    范例1-85 一趟快速排序的改进算法 248 ∷相关函数:QuickSort函数 1.5.10 简单选择排序 250 范例1-86 简单选择排序 250 ∷相关函数:SelectSort函数 1.5.11 箱子排序 252 范例1-87 箱子排序 252 ∷相关函数:...

    数据结构(C++)有关练习题

    在计算机科学发展过程中,早期数据结构教材大都采用PASCAL语言为描述工具,后来出现了采用C语言为描述工具的教材版本、至今又出现了采用C++语言为描述工具的多种教材版本。本教实验指导书是为已经学习过C++语言的...

    c语言经典案例

    实例022 快速排序 27 实例023 选择排序 28 实例024 归并排序 29 实例025 二分查找 31 实例026 分块查找 32 实例027 哈希查找 34 实例028 斐波那契数列 37 实例029 哥德巴赫猜想 38 实例030 尼科彻斯定理 39 第4章 ...

    C语言编程精彩百例(附原书源代码)

    基本信息 ...实例94 用C语言实现遗传算法 实例95 人工神经网络的C语言实现 实例96 K_均值算法 实例97 ISODATA算法 实例98 快速傅立叶变换 实例99 求解野人与传教士问题 实例100 简单专家系统

    计算机二级C语言考试题预测

    快速排序 D. 归并排序 (55) 在设计程序时,应采纳的原则之一是(A) 注:和设计风格有关 A. 程序结构应有助于读者理解 B. 不限制goto语句的使用 C. 减少或取消注解行 D. 程序越短越好 (56) 下列不属于软件调试技术的...

    sort:对“模板” C中的例程实现进行排序

    排序概述sort.h是C语言中大量排序算法的实现,具有包含时间提供的用户定义类型。 这意味着您不必支付使用标准库例程的函数调用开销。 这也为我们提供了高级语言泛型的功能。 另外,您不必链接库:此排序库的全部包含...

    C程序范例宝典(基础代码详解)

    实例131 快速排序 195 实例132 选择排序 197 实例133 归并排序 198 4.3 查找算法 199 实例134 顺序查找 199 实例135 二分查找 201 实例136 分块查找 202 实例137 哈希查找 203 4.4 定理与猜想 206...

    SPEA2 C++代码实现

    //将Pt和Qt并入到Rt中(初始时t=0),对Rt进行快速非支配解排序, //构造其所有不同等级的非支配解集F1、F2........ int Rnum; int Pnum; int Qnum; //P,Q,R中元素的个数 void calc_fitness();//计算P ,Q群体...

Global site tag (gtag.js) - Google Analytics