【算法设计-快速排序】随机快速排序算法

1.算法流程:

但是为了减少算法因为初始数据可能已经部分按大小排序,导致算法复杂性会变成o(n2)进行了随机选择方法

在random_partition中随机产生(p,r)之间的一个数字,然后交换A[i]与A[r]这样会使得快速排序算法的复杂性得到降低。

代码实现:

#include<stdio.h>

#include<stdlib.h>

#define DataType int

void FastSort(DataType A[], int left, int right);//快速排序

int random_partition(DataType A[],int p,int r)

{

int i=rand()%(r-p+1)+p;

{

int temp=A[i];

A[i]=A[r];

A[r]=A[i];

}

int x=A[r];

int i=p-1;

for(int j=p;j<=r-1;j++)

{

if(A[j]<=x)

{

i=i+1;

{

int temp=A[i];

A[i]=A[j];

A[j]=temp;

}

}

}

{

int temp=A[i+1];

A[i+1]=A[r];

A[r]=temp;

}

return i+1;

}

void FastSort(DataType A[], int left, int right)

{

if(left<right)

{

int pivotloc=partition(A,left,right);

FastSort(A,left,pivotloc-1);

FastSort(A,pivotloc+1,right);

}

}

DataType main(void)

{

DataType *A = (DataType *)malloc(sizeof(DataType));

DataType key;

DataType i = 1;

A[0] = 0;

printf("请您随便输入数字,然后本程序对这些数字从小到大排序!按#结束\n");

while (scanf("%d", &key) == 1)

{

A[i] = key;

i++;

}

printf("排序后的结果是:\n");

FastSort(A, 1,i - 1);

DataType k;

for (k = 1; k <= i - 1; k++)

printf("%d ", A[k]);

return 0;

}

时间: 2024-07-31 14:23:12

【算法设计-快速排序】随机快速排序算法的相关文章

【转载】算法设计之五大常用算法设计方法总结

转载自http://blog.csdn.net/zolalad/article/details/11393915 算法设计之五大常用算法设计方法总结 一.[分治法]  在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)--等.任

快速排序/随机快速排序

快速排序是一个递归算法,重点是Partition()函数的实现过程.随机快速排序中调用Randomized_Partition(),此函数的实现只需要在Partition()的基础上前面多一个随机化和交换的过程. int Partition(int*A,int p,int r); int Randomized_Partition(int*A,int p,int r); void Quicksort(int *A,int p,int r); void Randomized_Quicksort(in

算法设计与分析——快速排序

快速排序是基于分治策略的另一种排序算法,其基本思想是,对于输入的子数组a[p:r],按照以下3个步骤进行排序. private static void qSort(int p,int r) { if(p<r) { int q = partition(p,r); qSort(p,q-1);//对左半段排序 qSort(q+1,r);//对右半段排序 } } private static int partition(int p,int r) { int i = p; int j = r + 1; C

《算法设计与分析》--算法第二章上机实践报告

开门见山,直接上题目. 7-2 改写二分搜索算法 (20 分) 设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j.当搜索元素在数组中时,i和j相同,均为x在数组中的位置. 输入格式: 输入有两行: 第一行是n值和x值: 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔. 输出格式: 输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j.当搜索元素在数组中时,i和j相同. 提示:若x小于全部数

通信算法之八:通信系统算法设计、RM编码算法性能验证

1.RM编码选择 信道环境:AWGN 信噪比:SNR 编码 : RM(5,16),RM(10,32) MATALB仿真架构: 源比特 +RM +QPSK调制+ 扩频+AWGN +解扩+QPSK解调+RM +BLER 说明:两种RM编码方式. 其中RM(10,32)的BLER = -21dB,rawBer = -8.5dB. <详细资料,及相应MATLAB代码,咨询qq:1279682290 >

《算法设计与分析》--算法第二章分治感想

分治法体会 分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质. 3) 利用该问题分解出的子问题的解可以合并为该问题的解: 4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题. 这个方法太棒了,我以前从来想不到用这个思想. 等我参悟了这个方法肯定会变强! 结对编程 结对编程太妙了,抱大佬的大腿,对自己的思想也有很大启发,太棒了. 原文地址:https:

算法设计方法:递归的内涵与经典应用

摘要: 大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归.毋庸置疑地,递归确实是一个奇妙的思维方式.对一些简单的递归问题,我们总是惊叹于递归描述问题的能力和编写代码的简洁,但要想真正领悟递归的精髓.灵活地运用递归思想来解决问题却并不是一件容易的事情.本文剖析了递归的思想内涵,分析了递归与循环的联系与区别,给出了递归的应用场景和一些典型应用,并利用递归和非递归的方式解决了包括阶乘.斐波那契

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

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

『算法设计_伪代码』快速排序

快速排序 随机快排 原文地址:https://www.cnblogs.com/hellcat/p/9255260.html

算法整理(四):浅析快速排序的优化问题

前文介绍了快速排序的单边扫描和双边扫描,但么有做对比,今天来简单分析下. 一.单边扫描的缺点 单边扫描最大的缺点是每次都要交换,如果一个数组是 5 4 3 2 1,用单边扫描的话,则从4开始,4要和4交换一次,3要和3交换一次,依次类推,这种无意义的操作.正因此用双边扫描会更好,第一趟只需交换一次,就能得到1 4 3 2 5这样的数组.但双边扫描也是可以进一步优化的. 二.双边扫描的优化 优化一:对key值得选取应该使用随机选取的原则,而非第一个数字.意义大家都懂得. 优化二:前文的方法是挖坑法