[Q]
(https://www.51nod.com/Challenge/Problem.html#!#problemId=2108)
/***
*author:archiyectyqx
*time:20190311
*QuickSort
***/
#include <stdio.h>
int a[101],n;//定义全局变量,这两个变量需要在子函数中使用
void quicksort(int left,int right)
{
int i,j,t,temp;
if(left>right)
return;
temp=a[left]; //temp中存的就是基准数
i=left;
j=right;
while(i!=j)
{
//顺序很重要,要先从右往左找
while(a[j]>=temp && i<j)
j--;
//再从左往右找
while(a[i]<=temp && i<j)
i++;
//交换两个数在数组中的位置
if(i<j)//当哨兵i和哨兵j没有相遇时
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
//最终将基准数归位
a[left]=a[i];
a[i]=temp;
quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程
quicksort(i+1,right);//继续处理右边的,这里是一个递归的过程
}
int main()
{
int i,j,t;
//读入数据
scanf("%d",&n);
for(i=1; i<=n; i++)
scanf("%d",&a[i]);
quicksort(1,n); //快速排序调用
//输出排序后的结果
printf("%d\n",n);
for(i=1; i<=n; i++)
printf("%d\n",a[i]);
getchar();
getchar();
return 0;
}
emmm快速排序学的不是很好,但就是好用,没办法。
哎(〃‘▽’〃),再加个c++版的。
//标准分割函数
parititionl(int a[],int low,int high) {
int pivot = A[low];
while(low<high) {
while(low<high&&A[high]>=pivot) {
--high;
}
A[low]=A[high];
while(low<high&&A[low]<=pivot) {
++low;
}
A[high]=A[low];
}
A[low]=pivot;
return low;
}
void QuickSort(int A[],int low,int high) //¿ìÅÅĸº¯Êý
{
if(low<high) {
int pivot=Parititionl(A,low,high);
QuickSort(A,low,pivot-1);
QuickSort(A,pivot+1,high);
}
}
算法的核心就是递归
思想!!
以下摘要自《啊哈算法》
快速排序由 C. A. R. Hoare(东尼·霍尔,Charles Antony Richard Hoare)在1960 年提出,
之后又有许多人做了进一步的优化。如果你对快速排序感兴趣,可以去看看东尼·霍尔
1962 年在Computer Journal 发表的论文“Quicksort”以及《算法导论》的第七章
分析快排相对于其他排序算法的优势及其复杂度
快速排序之所以比较快,是因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候
设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全
部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样只能在相邻的数之间进
行交换,交换的距离就大得多了。因此总的比较和交换次数就少了,速度自然就提高了。当
然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和
冒泡排序是一样的,都是O(N2),它的平均时间复杂度为O (NlogN)。其实快速排序是基于一
种叫做“二分”的思想。
葱鸭!
- 并查集
- bfs
- dfs
- 动态规划背包问题
- hash表
- STL map bitset set