【数据结构】对一个数组按给定的下标排序,仅使用两两交换的方式,要求不能对数组进行扩容尽可能使用额外少的空间

原创 2016年12月15日 22:39:00

题目描述:

    对一个数组按给定的下标排序,仅使用两两交换的方式,要求不能对数组进行扩容尽可能使用额外少的空间。

例如:原数组为:A,B,C,D,E,现给定新的位置为:3,0,1,4,2,那么排序后为D,A,B,E,C。

问题分析:

    为什么分类为数据结构,因为其实这个题就是快排的挖坑法的变形。如果你还不清楚什么是快排的挖坑法:参见这里

解决思路:

    保存第一个位置的数据后,把第一个位置设为坑,如果给定的新位置与现在i所在位置不相等,说明数据不在我们期待的位置,则把下标为新位置的数据放到i的位置。


代码实现:

#include<iostream>
using namespace std;

void SwapSort(int*pArr, int*pPos, size_t n)
{
	size_t i = 0;
	int tmp = 0;
	tmp = pArr[i];         //第一个坑
	while (--n)         //总共交换n-1次
	{
		if (i != pPos[i])
		{

			pArr[i] = pArr[pPos[i]];
			i = pPos[i];
		}
	}
	pArr[i] = tmp;    //把最开始坑里的数据填到最后一个坑的位置
}
int main()
{
	int arr[] = { 'A', 'B', 'C', 'D', 'E' };
	int pos[] = { 3, 0, 1, 4, 2 };
	SwapSort(arr, pos, sizeof(arr)/sizeof(arr[0]));
	for (size_t i = 0; i < 5; i++)
	{
		cout << (char)arr[i] << " ";
	}
	cout << endl;
	getchar();
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

对一个数组,按照给定的下标进行排序,仅使用两两交换的方式

对一个数组,按照给定的下标进行排序,仅使用两两交换的方式,空间复杂度O(1)。例:原数组 A B C D E,现给定新位置为3 0 1 4 2 排序后的结果是D A B E C 初次见到这道题...
  • LF_2016
  • LF_2016
  • 2016年12月17日 15:11
  • 1264

对一个数组按给定的下标排序,仅使用两两交换的方式,要求不能对数组进行扩容尽可能使用额外少的空间。原数组为:A,B,C,D,E, 现给定新的位置为3, 0, 1, 4, 2那么排序为D,A,B,E,C

题目描述: 对一个数组按给定的下标排序,仅使用两两交换的方式,要求不能对数组进行扩容尽可能使用额外少的空间。 例如:原数组为:A, B, C, D, E, 现给定新的位置为:3, 0, 1, 4, 2...
  • weizhengbo
  • weizhengbo
  • 2017年07月16日 18:06
  • 367

如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)

题目: 写一个函数判断一个int类型的数组是否是有效的。  所谓有效是指:假设数组大小为n,那么这个int数组里的值为0~n-1之间的数,并且每个数只能出现一次,否则就是无效数组。  例如[...
  • wuli2496
  • wuli2496
  • 2014年12月26日 15:58
  • 1617

给定字符串(ASCII码0-255)数组,请在不开辟额外空间的情况下删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个。例如:" i am a little boy.

import java.util.Scanner;public class Test { public static void main(String[] args){ Sca...
  • woshichuanqihan
  • woshichuanqihan
  • 2016年08月03日 22:03
  • 852

归并排序及其空间复杂度的思考

对归并排序来说: 如果对Merge的每个递归调用都声明一个临时数组,那么任一时刻可能会有logN个临时数组处于活动期,这对小内存机器是致命的。另一方面,如果Merge动态分配并释放最小量临时空间,那么...
  • u013074465
  • u013074465
  • 2014年12月20日 17:27
  • 3792

2014年去哪儿网笔试题--给定一个整型数组,对这个整型数组排序,使得按序拼接数组各元素得到的值最小。

2014年去哪儿网笔试题--给定一个整型数组,对这个整型素组排序,使得按序拼接数组各元素得到的值最小。 我的大致思路是把这个整型数组转换成String数组,然后通过String类的compareTo方...
  • lands92
  • lands92
  • 2014年08月02日 09:47
  • 2087

不用额外变量交换两个整数的值

不用额外变量交换两个整数的值 【题目】   如何不用任何额外变量交换两个整数的值? 【解答】   使用位运算的异或运算,或者使用加法运算   a异或b的结果是c,那么c就是a整数位信息和b整数位信息的...
  • u010456903
  • u010456903
  • 2015年10月04日 23:01
  • 1092

用C#实现对数组元素排序(冒泡法)

昨天学习了如何用Split方法对数组进行处理,还学习了如何用Array.Sort()方法对数组进行排序,今天来研究下冒泡算法 冒泡算法(Bubble Sort)先画表来说明下: 比如说,我们有个八位...
  • qq_21018935
  • qq_21018935
  • 2016年11月09日 16:31
  • 1753

数组中第K小的数字

数组中第K小的数字 题目描述: 给定两个整型数组A和B。我们将A和B中的元素两两相加可以得到数组C。 譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,...
  • u012736084
  • u012736084
  • 2014年02月12日 13:41
  • 1016

编程题目:PAT 1008. 数组元素循环右移问题 (20)

1008. 数组元素循环右移问题 (20) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 8000 B ...
  • zhangyalin1992
  • zhangyalin1992
  • 2014年07月01日 20:02
  • 5003
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【数据结构】对一个数组按给定的下标排序,仅使用两两交换的方式,要求不能对数组进行扩容尽可能使用额外少的空间
举报原因:
原因补充:

(最多只允许输入30个字)