题目:有1,2,3,..n 的无序整数数组,求排序算法。要求时间复杂度 O(n), 空间复杂度O(1)。

分析:对于一般数组的排序显然 O(n) 是无法完成的。 既然题目这样要求,肯定原先的数组有一定的规律,让人们去寻找一种机会。

例如:原始数组: a = [ 10, 6,9, 5,2, 8,4,7,1,3 ] ,如果把它们从小到大排序且应该是 b = [1,2,3,4,5,6,7,8,9,10 ],也就是说: 如果我们观察 a --> b 的对映关系是: a[i] 在 b 中的位置是 a[i] - 1,即a[i]=b[a[i]-1]

代码:

#include<iostream>
#include<ctime>
using namespace std;
void print(int* a, int n){
for (int i = ; i < n; i++){
cout << a[i] << ",";
}
cout << endl;
}
void FancySort(int* a, int n){
int temp;
int swapCount = ;
for (int i = ; i < n;)
{
swapCount++;
//a[i]-1为a[i]在有序数组中的位置
//因此a[i]与a[a[i]-1]交换后,a[i]就处于正确位置了
//但交换后的a[a[i]-1]不一定处于正确位置
temp = a[a[i] - ];
a[a[i] - ] = a[i];
a[i] = temp;
cout << "第" << swapCount << "次交换 " << "i=" << i << endl;
print(a, n);
//直到第i位也有了正确的数字,开始处理下一位
if (a[i] == i + )
i++;
}
}
int main(){
while (true){
cout << "输入n:" << endl;
int n;
cin >> n;
int* a = new int[n];
for (int i = ; i < n; i++){
a[i] = ;
}
//对数组(1,2,....一直到n的无序数组)赋予初始化随机值
srand(time());
for (int i = ; i <= n;){
int randV = rand() % n;
if (a[randV] == ){
a[randV] = i;
i++;
}
}
cout << "the input array:";
print(a, n);
FancySort(a, n);
cout << "排序结果:";
print(a, n);
cout << endl;
}
return ;
}

结果:

有1,2,3一直到n的无序数组,排序的更多相关文章

  1. In-Memory:内存数据库

    在逝去的2016后半年,由于项目需要支持数据的快速更新和多用户的高并发负载,我试水SQL Server 2016的In-Memory OLTP,创建内存数据库实现项目的负载需求,现在项目接近尾声,系统 ...

  2. .net点选验证码实现思路分享

    哈哈好久没冒泡了,最进看见点选验证码有点意思,所以想自己写一个. 先上效果图 如果你被这个效果吸引了就请继续看下去. 贴代码前先说点思路: 1.要有一个汉字库,并按字形分类.(我在数据库里是安部首分类 ...

  3. 关于DOM的操作以及性能优化问题-重绘重排

     写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScri ...

  4. H5实现摇一摇技术总结

    摇一摇遇到的问题 一.如何对摇晃效果进行反馈 刚开始的处理方式是,摇晃过程中不做任何处理,但后来反馈说这种效果不好,好像就没有摇动一样,如果声音也不响的话,就真的和什么都没发生一样. 后来想了想,加入 ...

  5. Vue.js 和 MVVM 小细节

    MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...

  6. 你必须知道的EF知识和经验

    注意:以下内容如果没有特别申明,默认使用的EF6.0版本,code first模式. 推荐MiniProfiler插件 工欲善其事,必先利其器. 我们使用EF和在很大程度提高了开发速度,不过随之带来的 ...

  7. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  8. C语言 · 高精度加法

    问题描述 输入两个整数a和b,输出这两个整数的和.a和b都不超过100位. 算法描述 由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储.对于这种问题,一般使用数组来处理. 定义一个数组A ...

  9. Online Judge(OJ)搭建(第一版)

    搭建 OJ 需要的知识(重要性排序): Java SE(Basic Knowledge, String, FileWriter, JavaCompiler, URLClassLoader, Secur ...

  10. Oracle分析函数入门

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

随机推荐

  1. backup2

    /// <summary> /// 先在窗体上添加LicenceControl控件 /// Enable 3D analysis /// </summary> public v ...

  2. 前端菜鸟的编程之路之css的用法

    /* * * 固定特殊类 * */ /* ===========固定宽度*============= */ .ld-with80{width: 80px} .ld-with50{width: 50px ...

  3. Vuejs使用笔记 --- component内部实现

    现在来系统地学习一下Vue(参考vue.js官方文档): Vue.js是一个构建数据驱动的web界面的库,其目标是实现响应的数据绑定和组合的试图组件. Vue.js拥抱数据驱动的视图概念,这意味着我们 ...

  4. Processing简明教程与Java平台移植方法

    1 Processing    1.1 Processing简介          Processing是一种具有革命前瞻性的新兴计算机语言,它的概念是在电子艺术的环境下介绍程序语言,并将电子艺术的概 ...

  5. 第六百一十七天 how can I 坚持

    没什么特长,唯一有的仅是妄想,哈哈,真逗. 明天就去新项目组了,会接触些新东西吧,啊,挺好,一开始压力大点很正常,但不要放弃啊. 搞不懂我自己啊,貌似不上火了呢. 睡觉了.忘不掉.做不到.

  6. Spark学习笔记之SparkRDD

    Spark学习笔记之SparkRDD 一.   基本概念 RDD(resilient distributed datasets)弹性分布式数据集. 来自于两方面 ①   内存集合和外部存储系统 ②   ...

  7. jsPlumb的简单使用

    jsPlumb概述jsPlumb是一个在dom元素之间绘制连接线的javascript框架,它使用svg技术绘制连接线. 基本概念很明显,一个连线主要要解决的问题包括谁和谁连,在哪里连(连接点在哪里) ...

  8. js判断input输入框长度(支持中英文输入)

    function CheckTxtLength(txt) { var num = txt.replace(/[^\x00-\xff]/g, 'xx').length; if (num <=11) ...

  9. mvc、三次握手

    1.所谓MVC便是: ① View:(查看,观察)就只处理View的事情,其它神马都不要管 ② 数据由Model处理,并且为View提供渲染需要的数据 ③ 由于后端可能抽风可能将name变成Name坑 ...

  10. java中的静态变量---static

    用static修饰符修饰的数据成员,并不是属于那个对象的,而是属于类.静态数据成员在定义的时候已经分配了内存,而此时对象还没有建立好. 当然它也是被保存到类的方法中的,而不是对象内存中,大家都是可以访 ...