您的位置:首页 > 其它

对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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: