算法快排。

Posted 生活待我如初恋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法快排。相关的知识,希望对你有一定的参考价值。

以前的我总以为排序就是指代冒泡排序。

直到写到了一题排序的题,提交答案直接给我时间超时间。。。后来再知道快速排序这个东西。

于是,我搞了一个下午才弄懂了这个算法(我是一个极水的人),所以来博客写上自己的思路巩固一下自己对着方面的认识。

 

 

快速排序:

简称快排,顾名思义,就是时间复杂度低,与冒泡排序相比之下,该算法更适合为一些长的没有序的数组进行排序。

思想:

我是先前设一个start   和end   分别记录数组的首尾。我们在随便选择一个作为比较。

我这里就把start作为比较,其实很简单,就是将比start大的放在他后面,比他小的放在他前面,这样进行一次调用就能将这个start的最终的位置决定,当然调用一次我们得到的依然是没有序的数组,所以要进行多次的调用,在这里又一个叫做分治算法(因为start最后的位置不在首尾,那么就把原先的数组一分为2,然后我们分别对左,右边进行快排。)

 

代码如下:

int quicksort(int a[],int start,int end)
{
int i,j,x=a[l];
i=start;           j=end;
if (start>=end)    

       return ;
while (start<end)
{
while (i<j&&a[j]>=x)    j--;
a[i]=a[j];
a[j]=x;
i++;
while (i<j&&a[i]<=x)    i++;
a[j]=a[i];
a[i]=x;
j--;
}
quicksort(a,start,i-1);
quicksort(a,i+1,end);       //此处只二分一次,后面不再二分,因为初始值(i等)会改变 ,会影响后面的排序。

}

 

 

 

*********************************该处是我后来补充**********************************

其实快排有头文件包含了,比如c++  的qsort(n,n+p)       但是我说的不是这个,下面的又一个方法

 

先附上代码:

 

#include<stdio.h>
#include<stdlib.h>                         //该有文件包含了qsort等需要的成分
int cmp(const void*a,const void*b)       //cmp 不是一定,可以改成其他,例如cmp改成mmp都是可以的,                                                                                   //   但是下面的 qsort中 的cmp也要相应变化

{

return (*(int *)a-*(int *)b);             //  a-b是正序      b-a是倒叙   


int main()
{
int n,i,a[1010];
scanf ("%d",&n);
for (i=0;i<n;i++)
scanf("%d",&a[i]);
qsort(a,n,sizeof(int),cmp);
for (i=0;i<n;i++) 
printf ("%d ",a[i]);
return 0;
}

以上是关于算法快排。的主要内容,如果未能解决你的问题,请参考以下文章

排序算法:堆排,快排的实现(快排的三种实现方法以及快排的优化)

算法 - 快速排序 - 经典快排 | 随机快排

40分钟掌握快速排序-三路快排算法

排序算法——快排思想

分治算法之快排和归并

随机快排算法