P1177 【模板】快速排序(二分排序)

简介: P1177 【模板】快速排序(二分排序)

题目描述



利用快速排序算法将读入的  N 个数从小到大排序后输出。


快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成。(C++ 选手请不要试图使用 STL,虽然你可以使用 sort 一遍过,但是你并没有掌握快速排序算法的精髓。)


输入格式



第 1  行为一个正整数 NN,第 2  行包含  N 个空格隔开的正整数  ai,为你需要进行排序的数,数据保证了  Ai 不超过 10^9 。


输出格式



将给定的 N  个数从小到大输出,数之间空格隔开,行末换行且无空格。


输入输出样例



输入 #1复制

1. 5
2. 4 2 4 5 1


输出 #1复制

1 2 4 4 5


说明/提示



对于  20% 的数据,有 N≤103;

对于  100% 的数据,有 N≤10^5。


#include<iostream>
using namespace std;
int a[100000];
void yyds(int n,int q)//2分法 就是不断的把比中间的数小的放在左边,大的放在右边,重复这个过程。 
{
int i=n,j=q;
int mid=a[(n+q)/2];
while(i<=j)//如果刚刚好到达中间的数就退出循环 
{
  while(a[i]<mid) i++;//找到左边比中间大的数 
  while(a[j]>mid) j--;//找到右边比中间小的数 
  if(i<=j)//可能会出现都到达中间位置 
  {
    swap(a[i],a[j]);
    i++;
    j--;
  }
}
if(n<j)yyds(n,j);//因为j在左边i在右边 
if(i<q)yyds(i,q);
}
int main()
{
  int i,m;
  cin>>m;
  for(i=1;i<=m;i++)
  {
    cin>>a[i];
  }
  yyds(1,m);
  for(i=1;i<=m;i++)
  {
    cout<<a[i]<<' ';
  }
}
相关文章
|
8月前
|
算法 搜索推荐 C++
【洛谷 P1177】【模板】快速排序 题解(快速排序+数组索引)
**快速排序模板题目**,要求使用快排算法对输入的整数序列进行排序。输入包含正整数N和N个整数,输出排序后的序列。20%的数据N≤10^3,所有数据N≤10^5。代码中提供了一种实现,包括读取输入、定义partition函数划分数组、递归调用quickSort及主函数执行排序和输出。注意C++选手避免使用STL的`sort`。
43 0
|
9月前
|
存储 搜索推荐 Java
排序之计数排序
排序之计数排序
|
9月前
|
C语言
排序:计数排序
排序:计数排序
45 0
|
9月前
|
搜索推荐 算法
排序——计数排序
排序——计数排序
43 0
|
9月前
|
JavaScript 搜索推荐 前端开发
JS数组自定义排序方法,冒泡排序、插入排序、选择排序和快速排序。
JS数组自定义排序方法,冒泡排序、插入排序、选择排序和快速排序。
93 0
|
9月前
|
搜索推荐
排序算法:快速排序(三种排序方式、递归和非递归)
排序算法:快速排序(三种排序方式、递归和非递归)
683 0
LetCode第912题 排序数组之冒泡排序
依次比较相邻的两du个数,将小数放在前面zhi,大数放在后面。即首先比较第dao1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再大于第2个数),将小数放前,大数放后,一直比较到最小数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最小数。如此下去,直至最终完成排序。
68 0
LetCode第912题 排序数组之冒泡排序
|
算法 搜索推荐
基本算法(排序和二分查找)
基本算法(排序和二分查找)
63 0
|
算法 搜索推荐
排序——冒泡排序
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
|
搜索推荐 C语言
用c语言代码将数列8、6、1、9、2从大到小排序。(要求:画出冒泡排序算法的排序过程)
用c语言代码将数列8、6、1、9、2从大到小排序。(要求:画出冒泡排序算法的排序过程)
127 0