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

原创 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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pointer_y/article/details/53678074

算法与数据结构面试题(14)-在数组中查找2个数的和为已知数

题目 题目:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。...
  • qhshiniba
  • qhshiniba
  • 2014-12-23 10:01:42
  • 1229

选择排序(choiceSort)_笔记

设一个长度为n的数组 1.拿数组中的第一个数据和后面的所有数据比较,如果前一个数据小于   后一个数据,那么交换两个数据的位置。 2.经过n-1次1的过程后最大的数据被放在了最开始的位置。 3...
  • cfp6523052
  • cfp6523052
  • 2014-05-17 13:52:21
  • 382

对一个数组按给定的下标排序,仅使用两两交换的方式,要求不能对数组进行扩容尽可能使用额外少的空间。原数组为: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:16
  • 500

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

对一个数组,按照给定的下标进行排序,仅使用两两交换的方式,空间复杂度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:50
  • 1385

Swift - 交换数组中两个元素位置

交换数组中两个元素位置方法一:苹果提供的swap方法代码var originArrayOne = [2,3,4] print("originArrayOne排序前:\(originArrayOne)"...
  • appleLg
  • appleLg
  • 2017-08-21 16:53:08
  • 1993

交换两个子数组的位置(只使用1个辅助空间)

一、问题描述 其实这是一个非常基本和常用的数组操作,它的描述如下: 有一数组X[0...n-1],现在把它发为两个子数组x1[0...m]和x2[m+1...n-1],交换这两个子数组,使用数组x由x...
  • ljianhui
  • ljianhui
  • 2013-11-03 01:19:31
  • 6065

请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)。 给定一个string iniString,请返回一个string,为翻转后的字符串。保证字符串的

请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)。 给定一个string iniString,请返回一个string,为翻转后的字符串。保证字...
  • miachen520
  • miachen520
  • 2016-06-27 20:47:18
  • 1467

请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)

请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)。 给定一个string iniString,请返回一个string,为翻转后的字符串。保证字符串...
  • z_opt
  • z_opt
  • 2017-05-29 09:32:47
  • 359

数据结构--一个数组实现两个栈

用一个数组实现两个栈,通常我们会想到以下几种方案: 1.奇偶栈,即就是将数组的偶数位置看作一个栈的存储空间,将奇数位置看作另一个栈的存储空间。 2.从中间分别向两边展开,即就是将数组的中间位置看作...
  • qq_29503203
  • qq_29503203
  • 2016-10-03 06:17:26
  • 1171
收藏助手
不良信息举报
您举报文章:【数据结构】对一个数组按给定的下标排序,仅使用两两交换的方式,要求不能对数组进行扩容尽可能使用额外少的空间
举报原因:
原因补充:

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