C/C++面试之算法系列--1~n无序数组时间复杂度为O(n)排序

转载自:http://blog.csdn.net/sailor_8318/article/details/3054383

1~n无序数组时间复杂度为O(n)排序

有1,2,....一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),使用交换,而且一次只能交换两个数.(华为)

分析:数组的特点是值和下标满足一定的关系,以此作为交换的终止条件。

但这个算法的时间复杂度如何证明是O(n)呢?

void sortOnorder1(int array[], int len)

{

int temp;

for(int i = 0; i < len; )

{

if ( array[i] != i + 1)//下标和值不满足对应关系

{

temp = array[array[i] - 1];        //不相等的话就把array[i]交换到与索引相应的位置

array[array[i] - 1] = array[i];

array[i] = temp;

}

else

i++; // 保存,以后此值不会再动了

}

}

void sortOnorder2(int array[], int len)

{

int temp;

int i = 0;

for(i = 0; i < len; i++)

{

//不相等的话就把array[i]交换到与索引相应的位置,若相等,其实本次循环没有任何意义,其不会对现有的数据产生任何影响

temp = array[array[i] - 1];

array[array[i] - 1] = array[i];

array[i] = temp;

}

for(i = 0; i < len; i++)

{

temp = array[array[i] - 1];        //不相等的话就把array[i]交换到与索引相应的位置

array[array[i] - 1] = array[i];

array[i] = temp;

}

}

int main()

{

int a[] = {10,6,9,5,2,8,4,7,1,3};

int b[] = {4,6,9,3,2,8,10,7,1,5};

int lena = sizeof(a) / sizeof(int);

int lenb = sizeof(b) / sizeof(int);

//sortOnorder1(a,lena);

sortOnorder2(a,lena);

for (int j = 0; j < lena; j++)

cout<<a[j]<<",";

cout<<"/n";

//sortOnorder1(b,lenb);

sortOnorder2(b,lenb);

for (int k = 0; k < lenb; k++)

cout<<b[k]<<",";

return 0;

}

C/C++面试之算法系列--1~n无序数组时间复杂度为O(n)排序

时间: 2024-11-08 01:50:33

C/C++面试之算法系列--1~n无序数组时间复杂度为O(n)排序的相关文章

【白话经典算法系列之十七】 数组中只出现一次的数 其他三次

本文地址:http://blog.csdn.net/morewindows/article/details/12684497转载请标明出处,谢谢. 欢迎关注微博:http://weibo.com/MoreWindows 首先看看题目要求: 数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次.请给出最快的方法找到x. 这个题目非常有意思,在本人博客中有<位操作基础篇之位操作全面总结>这篇文章介绍了使用位操作的异或来解决——数组中其他数字出现二次,而x出现一次,找出x.有<

算法系列15天速成——第三天 七大经典排序【下】

原文:算法系列15天速成--第三天 七大经典排序[下] 今天跟大家聊聊最后三种排序: 直接插入排序,希尔排序和归并排序. 直接插入排序: 这种排序其实蛮好理解的,很现实的例子就是俺们斗地主,当我们抓到一手乱牌时,我们就要按照大小梳理扑克,30秒后, 扑克梳理完毕,4条3,5条s,哇塞......  回忆一下,俺们当时是怎么梳理的. 最左一张牌是3,第二张牌是5,第三张牌又是3,赶紧插到第一张牌后面去,第四张牌又是3,大喜,赶紧插到第二张后面去, 第五张牌又是3,狂喜,哈哈,一门炮就这样产生了.

算法系列(十三)图论基本概念和拓扑排序

图的定义 一个图G=(V,E),由定点的集合V,和边的集合E组成.每一条边都是一副点对(v,w),边也称作弧,边上可以有权值.如果点对是有序的,那么图就是有向的. 图中的一条路径是一个顶点序列w1,w2,w3......wN,如果图中包含一条从顶点到自身的边,那么这个路径就是环. 有向无环图也成为DAG 如果在一个无向图中每个顶点到其它顶点都存在路径,则称这个无向图是连通的.具有这样性质的有向图被称为是强连通的.如果一个有向图不是强连通的,但是去掉方向后的基础图是连通的,那么该有向图称为是弱连通

数据结构与算法系列研究九——排序算法的一些探讨

四种排序 一.实验内容     输入20个整数,分别用希尔排序.快速排序.堆排序和归并排序实现由小到大排序并输出排序结果.二.关键数据结构与核心算法   关键数据结构:由于是排序为了简单起见,选用线性表中的数组作为存储结构.   核心算法:   1.希尔排序    希尔排序的核心还是直接插入法,但是插入的位置有所讲究.要把数组分为许多段,每一段的长度除了最后的有可能不同之外,其他的都相同.该段的长度即为增量,在最后一次必须为一,此时程序变成了直接插入.每次进行隔段插入,不断地调整是的数组变得隔段

程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大系列集锦

程序员面试.算法研究.编程艺术.红黑树.数据挖掘5大系列集锦

玩转算法系列--图论精讲 面试升职必备(Java版)

第1章 和bobo老师一起,玩转图论算法欢迎大家来到我的新课程:<玩转图论算法>.在这个课程中,我们将一起完整学习图论领域的经典算法,培养大家的图论建模能力.通过这个课程的学习,你将能够真正地,玩转图论算法:) 第2章 图的基本表示千里之行,驶于足下.解决任何有一个图论算法问题,首先需要用基本的数据结构来表示图.在这一章,我们就将探索图的基本表示问题,学习邻接矩阵和邻接表,进而,也让同学们熟悉这个课程的整体代码风格. 第3章 图的深度优先遍历任何一种数据结构,都需要进行遍历.图也不例外.通过深

白话经典算法系列之四 直接选择排序及交换二个数据的正确实现

分类: 白话经典算法系列 2011-08-09 11:15 16682人阅读 评论(29) 收藏 举报 算法面试c 直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接播放排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后. 设数组为a[0…n-1]. 1.      初始时,数组全为无序区为a[0..n-1].令i=0 2.      在无序区a[i…n-1]中选取一个最小的元素,将其与a[i]交

面试高级算法梳理笔记

面试高级算法梳理笔记 1.1 说明 本篇为<挑战程序设计竞赛(第2版)>读书笔记系列,旨在: 梳理算法逻辑 探索优化思路 深入代码细节 1.2 目录 原文首发于个人博客Jennica.Space,按算法难度划分为初中高三个级别,详细目录及链接如下: 初级篇 穷竭搜索 贪心 动态规划 数据结构 图论 数论 中级篇 二分搜索 常用技巧 数据结构(二) 动态规划(二) 网络流 计算几何 高级篇 数论(二) 博弈论 图论(二) 常用技巧(二) 智慧搜索 分治 字符串 1.3 题解 配套习题及详解同步发

[算法系列之二十二]包含T全部元素的最小子窗口

题目描述 给定一个包含一系列字符的集合T和字符串S,请在字符串S中找到一个最小的窗口,这个窗口中必须包含T中的所有字符. 例如, S = "ADOBECODEBANC" T = "ABC" 最小窗口是"BANC" 分析 这是一个有趣的问题,这个有趣的问题有多种方法来解决,最好的方法是非常简单,美丽的. 在这篇文章中,我首先说明了一个方法,是我第一次遇见这个问题时想到的.我的第一个方法有点复杂,同时也不是最好的解决方案(时间复杂度为O(NlgM))