快速排序 O(nlogn)
#include<bits/stdc++.h>
using namespace std;
int a[200],n;
void q_sort(int l,int r){
if(l>r)
return;
int i=l,j=r,md,t;
md=a[l];
while(i!=j){
while(a[j]>=md&&i<j)
j--;
while(a[i]<=md&&i<j)
i++;
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[l]=a[i];
a[i]=md;
q_sort(l,i-1);
q_sort(i+1,r);
}
int main(){
int i;
while(cin>>n){
for(i=0;i<n;i++)
cin>>a[i];
q_sort(0,n-1);
for(i=0;i<n;i++)
cout<<a[i]<<' ';
cout<<endl;
}
return 0;
}
其实非递归就是把需要递归的左右边界记录就好了
#include<iostream>
using namespace std;
struct lr{
int l,r;
};
const int N = 1e3 + 10;
int a[N];
void q_sort(int *a,int L,int R)
{
lr t[N];
int cur = 1;
t[cur].l = L,t[cur].r = R;
while(cur)
{
int last = cur;
int up = t[cur].r,down = t[cur].l;
//cout << down << " " << up << endl;
cur--;
int temp = a[down];
while(down < up)
{
while(a[up] >= temp && up > down)
--up;
while(a[down] <= temp && up > down)
++down;
if(down < up)
{
int na = a[down];
a[down] = a[up];
a[up] = na;
}
}
a[t[last].l] = a[down];
a[down] = temp;
if(down - 1 > t[last].l)
{
cur++;
t[cur].l = t[last].l;
t[cur].r = down - 1;
}
if(down + 1 < t[last].r)
{
cur++;
t[cur].l = down + 1;
t[cur].r = t[last].r;
}
}
}
int main()
{
int n;
while(cin >> n)
{
for(int i = 1;i <= n;i++)
cin >> a[i];
q_sort(a,1,n);
for(int i = 1;i <= n;i++)
cout << a[i] << " \n"[i == n];
}
return 0;
}
快速排序 O(nlogn)的更多相关文章
- 选择排序O(n^2)与快速排序O(nlogn)的优越性代码体现
随机函数生成一个超大数组: [code]: #include <iostream> #include <stdio.h> #include<time.h> #inc ...
- js算法-快速排序(Quicksort)
快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),简称快排,一种排序算法,最早由东尼·霍尔提出.在平均状况下,排序n个项目要O(nLogn)次比 ...
- swift冒泡排序,swift快速排序,swift归并排序,swift插入排序,swift基数排序
import UIKit /// 冒泡 /// ///时O(n2),空O(1) 稳定排序 func Mysort(arr:[Int]) -> [Int]{ var transArr = arr ...
- 快速排序 Vs. 归并排序 Vs. 堆排序——谁才是最强的排序算法
知乎上有一个问题是这样的: 堆排序是渐进最优的比较排序算法,达到了O(nlgn)这一下界,而快排有一定的可能性会产生最坏划分,时间复杂度可能为O(n^2),那为什么快排在实际使用中通常优于堆排序? 昨 ...
- 【Reading Note】算法读书杂记
1 排序 排序基本信息 稳定性:排序前大的数在排序后,大的数依然保持不变就是稳定排序,反之不稳定 内外排序:根据待排序的记录是否放在内存里面区分的.诸如:插入排序(直接插入&希尔).交换排序( ...
- JS实现常用排序算法—经典的轮子值得再造
关于排序算法的博客何止千千万了,也不多一个轮子,那我就斗胆粗制滥造个轮子吧!下面的排序算法未作说明默认是从小到大排序. 1.快速排序2.归并排序3.冒泡排序4.选择排序(简单选择排序)5.插入排序(直 ...
- js实现各种常用排序算法
1.冒泡排序 var bubbleSort = function (arr) { var flag = true; var len = arr.length; for (var i = 0; i &l ...
- 常用的 JS 排序算法整理
关于排序算法的问题可以在网上搜到一大堆,但是纯 JS 版比较零散,之前面试的时候特意整理了一遍,附带排序效率比较. //1.冒泡排序 var bubbleSort = function(arr) { ...
- 常用排序算法java实现
写在前面:纸上得来终觉浅.基本排序算法的思想,可能很多人都说的头头是到,但能说和能写出来,真的还是有很大区别的. 今天整理了一下各种常用排序算法,当然还不全,后面会继续补充.代码中可能有累赘或错误的地 ...
随机推荐
- Centos7查询开机启动项服务
问题描述: 最近安装了zabbix设置了一些开机启动服务 例如:zabbix-server.service,httpd.service,mariadb.service,或者系统的firework.se ...
- 关于无限试用JetBrains产品的方案
JetBrains免费试用期限为30天,通过对其试用机制的设想,找到了其破解试用机制的方案,具体如下: 在选择试用JetBrains产品的时候,它会在 C:\Users\用户名\对应产品\config ...
- Linux运维之如何查看目录被哪些进程所占用,lsof命令、fuser命令
之前将一块硬盘挂载到某个目录下,但是现在我想卸载掉这块硬盘,无论如何都umount不了,有些同学可能说需要加上 -f 参数强制卸载,理论上是可以的,但是在我这里依然不起作用,比如: [root@:vg ...
- MySQL的并发控制与加锁分析
本文主要是针对MySQL/InnoDB的并发控制和加锁技术做一个比较深入的剖析,并且对其中涉及到的重要的概念,如多版本并发控制(MVCC),脏读(dirty read),幻读(phantom read ...
- android:layout_margin真实含义 及 自己定义复合控件 layout()运行无效的问题解决
一.关于layout_margin 搞Android时间也不短了.对layout_margin也不陌生了,可近期遇到一个问题让我发现,对它的认识还不够深入全面.大量网络资料上都说,layout_mar ...
- Discrete Logging ZOJ - 1898 (模板题大小步算法)
就是求Ax三B(mod C)当C为素数时 #include<cstdio> #include<cstring> #include<cmath> #include&l ...
- java开发过程问题及解决
1.junit做测试时候报异常: junit.framework.AssertionFailedError: No tests found in com.mq.original.OriginalMqP ...
- 2018-2019-2 20165302程上杰 Exp6 信息搜集与漏洞扫描
1,实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.,实验内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测. ...
- Objective-C 类簇深入理解
类簇(class cluster),是一种基于抽象工厂的设计模式,广泛运用于系统的Foundation框架.顾名思义,即一坨类,这里指的是继承自同一父类的一组私有子类.这种实现既可以简化公共接口,又保 ...
- FreeRTOS队列
简单来讲队列是任务间通信的方式,队列本身是可以存储消息的,队列的消息可以由一个或者多个任务写入,也可以由一个或者多个任务读出,总之消息队列是任务间通信方式: