用随机数实现快速排序

实现快读排序算法的关键在于先在数组中选择一个数字,接下来把数组中的数字分为两部分,比所选数字小的移到左半部分,比选择的数字大的移到右边,具体的实现代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

void swap(int *a,int *b)
{
	int tmp=*a;
	*a=*b;
	*b=tmp;
}
int Partition(int data[],int n,int start,int end)
{
	int length=end-start+1;
	int index=rand()%(length+start);
	swap(&data[index],&data[end]);
	int small=start-1;
	for(index=start;index<end;index++)
	{
		if(data[index]<data[end])
		{
			small++;
			if(small!=index)
				swap(&data[index],&data[small]);
		}
	}
	small++;
	swap(&data[small],&data[end]);
	return small;

}
void quickSort(int data[],int n,int start,int end)
{
	if(start==end)
		return;
	int index=Partition(data,n,start,end);
	if(index>start)
		quickSort(data,n,start,index-1);
	if(index<end)
		quickSort(data,n,index+1,end);
}

int main()
{
	int n,a[100];
	while(scanf("%d",&n)!=EOF)
	{
		for(int i=0;i<n;i++)
			scanf("%d",&a[i]);
		quickSort(a,n,0,n-1);
		printf("快速排序之后:");
		for(int j=0;j<n;j++)
			printf("%d ",a[j]);
		printf("\n");
	}
	return 0;
}
时间: 2024-10-29 02:01:01

用随机数实现快速排序的相关文章

《github一天一道算法题》:快速排序和随机快速排序

看书.思考.写代码!!! /********************************* * [email protected] * blog: http://blog.csdn.net/hustyangju * 题目:快速排序和随机快速排序 * 思路:采用分治+原址排序,分裂函数将区间分为三个子区间:<=主元.主元和>主元区间,再在主元旁边的两个子区间递归调用排序 * 分裂函数一般将区间最后一个元素作为比较的主元,随机快排则随机选取区间内的一个元素交换到末尾作为主元 * 空间复杂度:原

并行归并排序——MPI

并行归并排序在程序开始时,会将n/comm_comm个键值分配给每个进程,程序结束时,所有的键值会按顺序存储在进程0中.为了做到这点,它使用了树形结构通信模式.当进程接收到另一个进程的键值时,它将该键值合并进自己排序的键值列表中.编写一个程序实现归并排序.进程0应该读入n的值,将其广播给其余进程.每个进程需要使用随机数生成器来创建n/comm_sz的局部int型数据列表.每个进程先排序各自的局部列表,然后进程0收集并打印这些局部列表.然后,这些进程使用树形结构通信合并全局列表给进程0,并打印最终

JS文字翻滚效果

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

快速排序法

#include <stdio.h> #include <stdlib.h> void swap(int *x,int *y)  //  交换函数 { int temp; temp = *x; *x = *y; *y = temp; } int choose_pivot(int i,int j )   //取两数平均值函数 { return((i+j) /2); } void quicksort(int list[],int m,int n)   //快速排序函数,m,n分别是左界

快速排序的优化(一)随机化快速排序

这周研究快速排序优化策略,首先是利用随机化对快速排序进行优化. 众所周知,之前的基础快速排序算法,其效率一个关键点就在与划分元素的选取,由于之前一直选取的是第一个元素,所以当遇到特殊输入,比如太大或者太小,就会造成区间划分极度不合理. 引入随机化,就是在每一次划分的时候随机选取一个元素作为关键字,用它来进行划分.由于每一次划分都是随机选取,所以每一次都选到不好的元素概率低,可以作为一个优化的方向. 和之前的基础快速排序主要区别有两个 1.首先是partition部分 利用rand产生随机数  ,

排序之快速排序(下)

快速排序优化 快排上是可以进行优化的,那么可以进行哪些优化了,是不是和你想的一样了? 我们往下看 1.优化枢纽值的选取 如果我们选取的pivotKey是处于整个序列的中间位置,那么我们可以将整个序列分成小数集合和大数集合了.但注意,我刚才说的是“如果……是中间”, 那么假如我们选取的pivotkey不是中间数如何呢?比如我们用到的数组{9,1,5,8,3,7,4,6,2},由代码“pivotkey=arr[low];”知道,我们应该选取9作为第一个枢轴pivotKey.此时,经过一轮 “pivo

使用快速排序对数组排序

是对气泡排序的一种改进,排序速度较快 int[] array = new int[10]; //生成随机数对象 Random random = new Random(); for (int i = 0; i < array.length; i++) { array[i] = random.nextInt(50); System.out.print(array[i]+" "); } System.out.println("\n排序后:"); quickSort(

快速排序小结

快速排序小结 大纲: 1.快排的原理 2.最坏情况 3.优化快排的方法 4.一般写法与更好的写法 1.快排的原理(本文重点)          伪代码: Void sqsort(int left,int right){ 1.随便找个数aN 2.把要排序的数组分成以下 区间 <aN|<aN|<aN|-|==aN|==aN|==aN|-|>aN|>aN|>aN|-| 3.分别递归<aN与>aN的两个部分 If(left<最右边的<aN.sub) sq

快速排序(QuickSort)

1.算法思想    快速排序是一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想    分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题.递归地解这些子问题,然后将这些子问题的解组合为原问题的解. (2)快速排序的基本思想    设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:①分解:      在R[low..high]中任选一个记录作为基准