最常用的排序——快速排序
快速排序和冒泡排序的原理是差不多的,但是快速排序交换位置是跳越的,所以有些时候它的复杂程度会优于冒泡排序。它的最差时间复杂度为O(N^2),但是它的平均复杂度为O(N*logN)。
首先,我们来对一组数进行排序
6 1 2 7 9 3 4 5 10 8
第一步,创立一个数组ar[10],我们需要寻找一个基准数,我们就规定最左边一个数为基准数。
6 1 2 7 9 3 4 5 10 8
然后从两边开始搜索(如果基准数在左边,就先从右边搜索,反之则搜索顺序反过来),把比基准数小的放在左边,比基准数大的放在右边。
i=0 j=9
从j- -开始
j=9 ar[j]=8 —— j=8 ar[j]=10 —— j=7 ar[j]=5比6小
然后开始i++
i=0 ar[i]=6 —— i=1 ar[i]=1 —— i=2 ar[i]=2 —— i=3 ar[i]=7比6大
最后交换此时ar[i]和ar[j]的数,顺序就变为
6 1 2 5 9 3 4 7 10 8
然后从这个位置接着进行搜索,直到i和j相等。
从j- -开始
j=7 ar[j]=7 —— j=6 ar[j]=4比6小
然后i++
i=3 ar[i]=5 —— i=4 ar[i]=9比6大
最后交换此时ar[i]和ar[j]的数,顺序就变为
6 1 2 5 4 3 9 7 10 8
然后继续
从j- -开始
j=6 ar[j]=9 —— j=5 ar[j]=3比6小
然后i++
i=4 ar[i]=5 —— i=5 此时i=j
所以交换基准数与ar[i]或者ar[j]交换
最后得到顺序为
3 1 2 5 4 6 9 7 10 8
这样6就在第6位上,所以6的位置就排好了。
我们再分别排6的左右两边,也就是3 1 2 5 4和9 7 10 8就好了。
这里我们用递归的思想就可以。
完整代码
#include<iostream>
using namespace std;
int ar[101],n; //定义全局数组
void quick_sort(int left,int right)
{
while(left>right)
{ return;
}
int i,j,temp,tt;
temp=ar[left];//把最左边的定义为基准数
i=left,j=right;
while(i!=j)
{
while(ar[j]>=temp &&i<j)//先从右往左搜索
{
j--;
}
while(ar[i]<=temp &&i<j)//再从左往右搜索
{
i++;
}
if(i<j)//如果没有碰到,就交换位置
{
tt=ar[i];
ar[i]=ar[j];
ar[j]=tt;
}
}
ar[left]=ar[i];//交换基准数的位置
ar[i]=temp;
quick_sort(left,i-1);
quick_sort(i+1,right);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&ar[i]);
}
quick_sort(1,n);
for(int i=1;i<=n;i++)
{
printf("%d ",ar[i]);
}
return 0;
}