排序算法——冒泡排序、简单选择排序

本文深入探讨两种基础排序算法——冒泡排序和简单选择排序。冒泡排序通过相邻元素的不断交换实现有序;简单选择排序则是每次在未排序部分找出最小值并放至已排序部分开头,直至全部排序完成。
摘要由CSDN通过智能技术生成

冒泡排序实际上是一种交换排序,它的核心思想就是对相邻的记录两两比较,逆序交换,直到没有逆序 。
简单插入排序算法主要思想是每次在剩余子序列中找到最小值并放到该子序列的第一个位置。 

#include<iostream>
using namespace std;
void swap(int* a, int* b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}
void SelectSort(int* a, int length)// 简单选择排序,每次在剩余序列中找到最小值跟第一个位置交换 
{
	int i, j;
	for(i = 0; i < length - 1; i++)//外循环控制趟数,一共进行 n-1趟,因为第n趟就剩一个元素且已经是最大值,所以没必要了 
	{
		int min = i;//假设第i个值为最小值,min存的一直是最小值的下标 
		for(j = i + 1; j < length; j++)//j从i的后一个位置开始直到最后结束 
		{
			if(a[j] < a[min])//如果发现第j个位置上的值比第min 个位置上的值小,就让min = j,min始终存最小值的下标 
			{
				min = j;
			}
		}
		if(i != min)//如果min和i不相等,就要交换,否则不用交换 
		{
			swap(a[i], a[min]);
		}
	} 
} 
void BubbleSort(int* a, int length)// 冒泡排序 1  从前往后 ,每一趟把一个最大值冒到上面 
{
	bool flag = true;//优化操作 
	for(int i = 0; i < length - 1&&flag; i++)//控制趟数   n-1趟 
	{
		flag = false;// 先将flag变为false 
		for(int j = 0; j < length - 1 - i; j++)// 注意j的判定条件,可以根据自己的想法调整,不是固定的 
		{//当你不知道j的判定条件是怎样的时候,可以拿一个特例验证一下,比如当i= 0 时,我们只需要j到达
		// 倒数第二个值,因为每次都是和后面的比较,所以j最大为 length - 2 - i(=0) 即 < length - 1 - i; 
			if(a[j] > a[j+1])
			{
				swap(a[j],a[j+1]);
				flag = true;//有交换操作则赋值为true,如果这一趟都没有进行过交换,就说明已经有序,下一趟就不进行了 
			}
		}
	}
}
void BubbleSort2(int* a, int length) // 冒泡排序2 从后往前 
{
	bool flag = true;
	for(int i = 0; i < length - 1&&flag; i++)// 控制趟数 
	{
		flag = false;
		for(int j = length - 1; j > i; j--)// j从最后一个记录向前比较 
		{
			if(a[j] < a[j-1])//如果它比前面的值小,就交换位置 
			{
				swap(a[j],a[j-1]);
				flag = true;
			}
		}
	}
}
int main()
{
	//验证算法,在此测试项中都可以通过 
	int a[] = {9,8,7,6,5,4,3,2,1};
	BubbleSort2(a, 9);
	for(int i = 0; i < 9; i++)
	{
		cout<<a[i]<<" ";
	} 
	cout<< endl;
	return 0;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值