以前的我总以为排序就是指代冒泡排序。
直到写到了一题排序的题,提交答案直接给我时间超时间。。。后来再知道快速排序这个东西。
于是,我搞了一个下午才弄懂了这个算法(我是一个极水的人),所以来博客写上自己的思路巩固一下自己对着方面的认识。
快速排序:
简称快排,顾名思义,就是时间复杂度低,与冒泡排序相比之下,该算法更适合为一些长的没有序的数组进行排序。
思想:
我是先前设一个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;
}