排序问题:将一组数据的无序顺序调整为有序顺序,下面介绍两种方法!

本文介绍了用C++实现的两种排序算法。冒泡排序通过相邻记录比较和交换,使小关键码记录上升、大关键码记录沉底,n个数据需进行n - 1轮比较。选择排序则是每趟从若干记录中选出最小关键码记录与对应位置交换。还给出了输入整数排序的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法一:冒泡排序法(bubble sort)

其基本思想是通过相邻两个记录(数据)之间的比较和交换,使关键码较小的记录逐渐从底部移向顶部(上升),关键码较大的记录逐渐从顶部移向底部(沉底),冒泡由此得名。设由A[1]~A[n]组成的n个数据。

即:两两比较(n-1+1)/2次,小的放小的里.

以7个数据为例,第一趟交换比较6次,第二趟交换比较5次以此类推。

容易知道当有n个无序数据要进行排序时,要进行n-1轮的比较,第x轮比较要进行n-x次的数据的两两交换。

eg:输入10给整数,将其排序:

#include<iostream>
using namespace std;
int main()
{
	int a[11];
	int i,j,t;
	for (i = 1; i <= 10; i++)//输入10个数组元素,使a[0]被系统随机赋初值,其余数组元素逐个输入
		cin >> a[i];
	cout << endl;
	for(j=1;j<=9;j++)//10个数要进行10-1轮的比较
		for (i = 1; i <=10-j ; i++)//第j轮进行10-j次的两两比较交换
		{
			if (a[i+1] >a[i ]){t = a[i ]; a[i] = a[i+1]; a[i+1] = t;//如果后一个数组元素大于前一个那么两个元素大小交换
			}
		}
	for (i = 1; i <= 10; i++)//输出数组元素,由大到小,也可以调整为a[i]>a[i+1]那么由小到大输出
		cout << a[i] << "  ";
	return 0;
}

方法二:选择排序法(selection sort)

其基本思想是第i趟选择排序通过n-i次关键码的比较,从n-i+1个记录中选出关键码最小的记录,并和第1个记录进行交换。设由A[1]~A[n]组成的n个数据。

       即将每一轮的最小值与a[0]对调,第二轮的最小值与a[1]对调,以此类推,每一轮求最小值要比较n-轮次(n为数据个数)

以7个数据为例:

eg.输入10个数将其排序

#include<iostream>
using namespace std;
int main()
{
	void s(int a[], int n);
	int a[10], i;  
	for (i = 0; i <= 9; i++)//输入要排序的十个数
		cin >> a[i];
	s(a, 10);//调用函数s来进行选择排序
	for (i = 0; i <= 9; i++)//经过调用后a数组已经排序完成
		cout << a[i] << ' ';
	return 0;
}
void s(int a[], int n)
{
	int i, j, k=0, t;
	for (i = 0; i < n - 1; i++)//经过9轮比较
	{
		k = i;//k其实是用来存储数组中最小元素的下标,这里认为a[0]为最小值
		for (j = i + 1; j < n; j++)//第一轮这个循环找出数组元素的最小值,第二轮循环找出除了a[0】的数组元素的最小值,以此类推
			if (a[j] < a[k])k = j;//每一个数与a[0]比较,用k存储最小值的下标
		t = a[k]; a[k] = a[i], a[i] = t;//第一次将数组元素的最小值与a[0]对换,第二次将第二轮的最小值与a[1]对换
	}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值