[C++成长日记]将一组数据从大到小排列后输出,并显示原数组中的下标

题目:将一组数据从大到小排列后输出,要求显示每个元素及它们在原数组中的下标

一些比较有意思的点:

  1. 冒泡排序添加监测点work
  2. 冒泡排序的有序性可以体现出来,如截图中的44
  3. 本程序中冒泡排序交换的是地址(索引数组元素)而非原数组元素,这点非常重要,要保持原始数据不被改变;另外可以提高效率(交换数据少,但是在本程序中其实差不多,int 4字节指针 4字节)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6L-O6aOO6LW36ZmN,size_15,color_FFFFFF,t_70,g_se,x_16

by gzhu_fwm

#include <iostream>
using namespace std;

void autoassign(int*& p, const int len);
void sort(int* p, int len);

int main() {
	int len, * p = NULL;
	cout << "请输入数组长度:";
	cin >> len;
	autoassign(p, len);
	sort(p, len);
	delete[]p;
}
void autoassign(int*& p, const int len)//初始化一个数组,并随机赋值
{
	p = new int[len];
	srand((unsigned int)time(0));
	cout << "数组中元素有:";
	for (int i = 0; i < len; i++)//随机赋值并输出
	{
		p[i] = rand() % (99 - 10 + 1) + 10;
		cout << p[i] << " ";
	}
}
void sort(int* p, int len)
{	//创建索引数组与下标数组
	int* pnum = new int[len];//下标数组
	int** pcopy = new int* [len]; //索引数组
	for (int i = 0; i < len; i++)//初始化
	{
		pnum[i] = i; pcopy[i] = &p[i];
	}
	//经典冒泡排序
	for (int i = 0; i < len - 1; i++)
	{
		int work = 1;
		for (int k = 0; k < len - i - 1; k++)
		{
			if (*pcopy[k] < *pcopy[k + 1])
			{	//交换索引地址与下标
				swap(pcopy[k], pcopy[k + 1]);
				swap(pnum[k], pnum[k + 1]);
				work = 0;
			}
		}
		if (work) break;
	}//对排序后的数组进行输出
	cout << endl << "排序后:\n元素" << '\t' << "原数组中的下标";
	for (int j = 0; j < len; j++)
	{
		cout << endl << *pcopy[j] << " \t";
		cout << pnum[j] << "\t";
	}
	delete[]pnum;
	delete[]pcopy;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值