分治算法——快速排序
快速排序是所有排序里最受欢迎的排序算法,时间复杂度O(NlogN),如果测试数据是有序的话,时间复杂度会下降到线性,也就是O(N^2),算法的核心思想是:挖坑填数。算法代码一般采用递归的形式。
算法思想:
找到一个基准数,也叫哨兵,在我的代码中为temp,用这个基准数去比较其他的所有数字,如果是从小到大排序的话,就让基准数左边的数都小于它,右边的数都大于它,如果是从大到小的话,反之。然后再把它左边的数再这样操作一遍,右边的数也这样操作一遍,依次递归,直到整个数字集合里只剩下一个数,则默认为这个数是有序的,返回。
举个例子:
共有5个数,分别为1 5 2 4 3.
第一次操作,操作的数分别为1 5 2 4 3。默认基准数为第一个数,或者或者随便什么一个数,这里默认为第一个数。第一个数为1,它右边的数都大于它,所以第一次操作的结果为:1 5 2 4 3.
第二次操作,因为1的左边没有数,直接退出。
第三次操作,操作的数分别为5 2 4 3。选基准数为5,5是最大的,所以第三次的操作结果为:2 4 3 5。
第四次操作,操作的数分别为2 4 3,。选基准数为2,2是最小的,所以第四次的操作结果为:2 4 3。
第五次操作,因为5是最大的,右边没有数,直接退出。
第六次操作,操作的数分别分为4 3,选基准数为4,操作结果为:3 4。
第六次操作,因为4左边没有数,退出。
第七次操作,操作的数为3,只有一个数,默认有序,退出。
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
int num[1001];
void q_sort(int l,int r)
{
if(l>r)return;
int i = l,j = r;
int temp = num[i];
while(i!=j)
{
while(i<j&&num[j]>=temp)j--;
while(i<j&&num[i]<=temp)i++;
if(i<j)std::swap(num[i],num[j]);
}
num[l] = num[i];
num[i] = temp;
q_sort(l,i-1);q_sort(i+1,r);
}
int main()
{
int n;
std::cin>>n;
for(int i = 0;i<n;i++)std::cin>>num[i];
q_sort(0,n-1);
for(int i = 0;i<n;i++)std::cout<<num[i]<<" ";
return 0;
}
随时随刻,当你想要颓废的时候,想想之前为何而来,当你想要放弃的时候,想想之前你为何坐在这里