快速排序模板
来源:互联网 发布:java桌面应用开发框架 编辑:程序博客网 时间:2024/06/06 10:26
有关快速排序的原理,网上有很多,在此就不赘述了,直接上代码。
#include<bits/stdc++.h>using namespace std;int a[100],n;void quicksort(int l,int r){ int i=l,j=r,t,tmp=a[l]; if(l>=r) return ; while(i!=j){ while(a[j]>=tmp&&i<j) j--; while(a[i]<=tmp&&i<j) i++; if(i<j){ t = a[i]; a[i] = a[j]; a[j] = t; } } a[l] = a[j]; a[j] = tmp; quicksort(l,i-1); quicksort(i+1,r);}int main(){ scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); quicksort(0,n-1); for(int i=0;i<n;i++) printf("%d ",a[i]); return 0;}
另外需要注意的地方(快速排序法为什么一定要从右边开始的原因)
while(a[j]>=tmp&&i<j) j--;while(a[i]<=tmp&&i<j) i++;
这里两个while的顺序是不能改变的,想一想:
假设对如下进行排序:
如上图,6在左,9在右 我们将6作为基数。
假设从左边开始(与正确程序正好相反)
于是i 就会移动到现在的 数字 7 那个位置停下来,而 j 原来在 数字 9 那个位置 ,因为while(arr[j]>=temp&&i<j)
于是,j 也会停留在数字7 那个位置,于是问题来了。当你最后交换基数6与7时,不对呀!!。
问题在于当我们先从在边开始时,那么 i 所停留的那个位置肯定是大于基数6的,而在上述例子中,为了满足 i<j 于是 j也停留在7的位置
但最后交换回去的时候,7就到了左边,不行,因为我们原本 交换后数字6在边应该是全部小于6,右边全部大于6.但现在不行了。
于是,我们必须从右边开始,也就是从基数的对面开始。
阅读全文
1 0
- 【排序】快速排序模板
- 【排序】快速排序模板
- 快速排序模板
- 快速排序模板
- C++快速排序模板
- C++快速排序模板
- 快速排序(模板)
- 快速排序【模板】
- 快速排序模板
- 快速排序----模板实现
- 快速排序函数模板
- 快速排序模板
- 快速排序【模板】
- 【模板】快速排序
- P1177 【模板】快速排序
- 【模板】快速排序
- 快速排序模板
- 洛谷 [模板]快速排序
- Could not open a connection to your authentication agent.
- R studio 快捷键 Mac
- Windows 10 原生 OpenSSH
- final
- C/C++ 第五周线性表 项目(二)建立链栈算法库
- 快速排序模板
- 同一服务器部署多个tomca的端口号修改详情(同时启动两个tomcat)
- 第三周项目1
- [Python]
- IOS集成ijkplayer
- python 输出练习
- group_concat()加上order by/group by会被截取字符串的解决办法
- java 解压zip文件
- 项目笔记2