简述快速排序(简述快速排序算法的基本思想)

http://www.itjxue.com  2023-01-26 02:28  来源:未知  点击次数: 

什么是随机快速排序

随机选择快速排序是一种比较常见的优化快速排序的方法,即随机选取一个元素作为主元,而不是像普通快速排序那样选取第一个元素作为主元,这种情况下虽然最坏情况仍然是O(n^2),但最坏情况不再依赖于输入数据,而是由于随机函数取值不佳。

实际上,随机化快速排序得到理论最坏情况的可能性仅为1/(2^n)。所以随机化快速排序可以对于绝大多输入数据达到O(nlogn)的期望时间复杂度。

简述各种排序算法的优缺点

一、冒泡排序

已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与 a[2]的值,若a[1]大于a[2]则交换 两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比 较a[3]与a[4],以此 类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n- 1]以相同方法 处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,以此类推。共处理 n-1 轮 后a[1]、a[2]、……a[n]就以升序排列了。

优点:稳定;

缺点:慢,每次只能移动相邻两个数据。

二、选择排序

每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数 据元素排完。

选择排序是不稳定的排序方法。

n 个记录的文件的直接选择排序可经过n-1 趟直接选择排序得到有序结果:

①初始状态:无序区为R[1..n],有序区为空。

②第1 趟排序 在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1 个记录R[1]交换,使R[1..1]和R[2..n]分别变 为记录个数增加1 个的新有序区和记录个数减少1 个的新无序区。

③第i 趟排序

第i 趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(1≤i≤n-1)。该趟 排序从当前无序区中选出关键字最 小的记录 R[k],将它与无序区的第1 个记录R 交换,使R[1..i]和R 分别变为记录个数增加1 个的新有序区和记录个数减少 1 个的新无序区。

这样,n 个记录的文件的直接选择排序可经过n-1 趟直接选择排序得到有序结果。

优点:移动数据的次数已知(n-1 次);

缺点:比较次数多。

三、插入排序

已知一组升序排列数据a[1]、a[2]、……a[n],一组无序数据b[1]、 b[2]、……b[m],需将二者合并成一个升序数列。 首先比较b[1]与a[1]的值,若b[1]大于a[1],则跳过,比较b[1]与a[2]的值, 若b[1]仍然大于a[2],则继续跳过,直 到b[1]小于a 数组中某一数据a[x],则将a[x]~a[n]分别向后移动一位,将b[1]插入到原来 a[x]的位置这就完成了b[1] 的插入。b[2]~b[m]用相同方法插入。(若无数组a,可将b[1]当作n=1 的数组a)

优点:稳定,快;

缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决 这个问题。

四、缩小增量排序

由希尔在1959 年提出,又称希尔排序(shell 排序)。

已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。发现当n 不大时,插入 排序的效果很好。首先取一增 量d(dn),将a[1]、a[1+d]、a[1+2d]……列为第一组,a[2]、a[2+d]、 a[2+2d]……列为第二组……,a[d]、a[2d]、a[3d]……="" 列为最后一组以次类推,在各组内用插入排序,然后取d'd,重复上述操="" 作,直到d="1。"

优点:快,数据移动少;=""

缺点:不稳定,d="" 的取值是多少,应取多少个不同的值,都无法确切知道,只能凭经验来取。=""

五、快速排序=""

快速排序是冒泡排序的改进版,是目前已知的最快的排序方法。

="" 已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先任取数据a[x]="" 作为基准。比较a[x]与其它数据并="" 排序,使a[x]排在数据的第k="" 位,并且使a[1]~a[k-1]中的每一个数="" 据a[x],然后采 用分治的策略分别对a[1]~a[k-1]和a[k+1]~a[n] 两组数据进行快速排序。

优点:极快,数据移动少;

缺点:不稳定。

什么是就地排序

快速排序是一个就地排序,分而治之,大规模递归的算法。从本质上来说,它是归并排序的就地版本。快速排序可以由下面四步组成。

(1) 如果不多于1个数据,直接返回。

(2) 一般选择序列最左边的值作为支点数据。

(3) 将序列分成2部分,一部分都大于支点数据,另外一部分都小于支点数据。

(4) 对两边利用递归排序数列。

什么是快速排序,

快速排序是平均速度最快的排序方法,思想如下:

每趟选中一个元素,并把这个元素插入到它的正确位置,

也就是说每趟排完之后,选中元素的左边都小于它,右边元素都大于它。然后

再分别对其左边部分和右边部分进行快速排序。

排序函数如下

/*排序函数*/

/*入口参数:数组,数组起始元素下标,末端元素下标*/

/*返回值:排好序后的数组*/

void sort(DataType a[],int left,int right)

{

DataType temp;

int i,j;

i=left;j=right;

temp=a[left];

while(ij)

{

while(ija[j].Averagetemp.Average)j--;

if(ij)

{

a[i]=a[j];

i++;

}

while(ija[i].Averagetemp.Average)i++;

if(ij)

{

a[j]=a[i];

j--;

}

}

a[i]=temp;

if(lefti)sort(a,left,i-1);

if(iright)sort(a,i+1,right);

}

排序算法有哪些,简述快速排序的核心

简单的: 冒泡,选择排序,插入排序,桶排序,

复杂点的: 堆排序,归并排序,快速排序,

还有?基数排序,计数排序(这两个我还没接触到,不懂)

快速排序核心:

每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样只能在相邻的数之间进行交换,交换的距离就大得多了。因此总的比较和交换次数就少了,速度自然就提高了。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?图片及快速排序简述来源于啊哈算法

(责任编辑:IT教学网)

更多

推荐PowerPoint文章