码迷,mamicode.com
首页 > 编程语言 > 详细

算法快排。

时间:2018-03-20 22:54:12      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:sort   思路   代码   AC   选择   自己   ++   文件   答案   

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

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

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

 

 

快速排序:

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

思想:

我是先前设一个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;
}

算法快排。

标签:sort   思路   代码   AC   选择   自己   ++   文件   答案   

原文地址:https://www.cnblogs.com/q1204675546/p/8613177.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!