对1...n,数组长度未知进行交换排序(无重复值,时间复杂度O(n), 空间复杂度O(1))
2015-06-16 01:29
323 查看
对1...n,数组长度未知进行交换排序(无重复值,时间复杂度O(n), 空间复杂O(1))。
这个题也是一个比较经典的面试题,大概思想是这样的:假设,有5个小朋友,D,B,E,A,C,那么,我们要实现他们的排序,可以先对他们依次进行编号:ABCDE分别代表的编号为01234,那么我们可以模拟一下这个过程:
1、首先,第一个元素是D,也就是3,那么我们要做的操作就是,交换D和占据3号位置的元素,即序列变为:A,B, E, D, C
2、接下来,我们仍让它从第一个开始判断,继续第一步的过程,我们会发现A, B都在自己合适的位置上,然后判断编号为4的E,此时它所在的位置为2号位置,显然不对,所以应该让它和第四号位置交换,得到的序列为:A, B,C, D, E
3、最后,还是继续第一步的判断,发现所有元素都满足要求,操作结束。
以下是代码:
#include <cstdio>
#include <algorithm>
using namespace std;
int main(){
int a[] = {2, 3, 9, 5, 4, 8, 6, 1, 7};
int temp;
unsigned int length = sizeof(a) / sizeof(a[0]), i = 0;
while (i < length){
if (a[i] == i + 1){ //a[i]在合适的位置,即a[i]的值为i+1
i++;
}
else{ //a[i]不在合适的位置,则把它和占它位置的值交换
swap(a[i], a[a[i] - 1]);
}
}
for (i = 0; i < length; i++){
printf("%5d", a[i]);
}
printf("\n");
return 0;
}
这个题也是一个比较经典的面试题,大概思想是这样的:假设,有5个小朋友,D,B,E,A,C,那么,我们要实现他们的排序,可以先对他们依次进行编号:ABCDE分别代表的编号为01234,那么我们可以模拟一下这个过程:
1、首先,第一个元素是D,也就是3,那么我们要做的操作就是,交换D和占据3号位置的元素,即序列变为:A,B, E, D, C
2、接下来,我们仍让它从第一个开始判断,继续第一步的过程,我们会发现A, B都在自己合适的位置上,然后判断编号为4的E,此时它所在的位置为2号位置,显然不对,所以应该让它和第四号位置交换,得到的序列为:A, B,C, D, E
3、最后,还是继续第一步的判断,发现所有元素都满足要求,操作结束。
以下是代码:
#include <cstdio>
#include <algorithm>
using namespace std;
int main(){
int a[] = {2, 3, 9, 5, 4, 8, 6, 1, 7};
int temp;
unsigned int length = sizeof(a) / sizeof(a[0]), i = 0;
while (i < length){
if (a[i] == i + 1){ //a[i]在合适的位置,即a[i]的值为i+1
i++;
}
else{ //a[i]不在合适的位置,则把它和占它位置的值交换
swap(a[i], a[a[i] - 1]);
}
}
for (i = 0; i < length; i++){
printf("%5d", a[i]);
}
printf("\n");
return 0;
}
相关文章推荐
- css实现布局
- IOS开发 如何给ViewController添加stroyboard entry pointer?
- Java Logging: LogManager
- Java Logging: Configuration
- 2014年最新前端开发面试题(题目列表+答案 完整版)
- Java Logging: LogRecord
- Java中Comparable和Comparator实现对象比较
- GirdLayout布局:更改其中的TextView控件的TextSize属性后,出现控件未对齐情况
- Python小知识(重要)二
- 类的加载顺序
- Java Logging API - Tutorial
- JSP(4)----servlet编程3
- POJ 3225 Help with Intervals(区间更新 + 倍增区间)
- 进程管理(二)
- Linux下取IP地址
- Spring如何解决循环依赖
- javascript读取freemaker的变量数据
- appium 自动化测试之知乎Android客户端
- Reverse Words in a String
- 一个简单的C#命令行参数程序