排序算法——O(n^2)(冒泡排序、选择排序、插入排序)

冒泡排序、选择排序、插入排序

在这里插入图片描述

1、冒泡排序(BubbleSort)

冒泡排序算法的运作如下:

  • 1、比较相邻的元素。如果第一个比第二个大(小),就交换他们两个。
  • 2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大(小)的数。
  • 3、针对所有的元素重复以上的步骤,除了最后已经选出的元素(有序)。
  • 4、持续每次对越来越少的元素(无序元素)重复上面的步骤,直到没有任何一对数字需要比较,则序列最终有序。
    在这里插入图片描述
#include<iostream>
#include<vector>

using namespace std;

void BubbleSort(vector<int>& arr)
{
	int n = arr.size();
	if (n < 2)
		return;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n - 1 - i; j++)// j开始等于0,
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}

}

int main() {
	vector<int> arr = { 9,8,7,5,7,3,4,1 };
	BubbleSort(arr);
	for (int i = 0; i < arr.size(); i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

2、选择排序(SelectionSort)

从头至尾扫描序列,找出最小的一个元素,和第一个元素交换,接着从剩下的元素中继续这种选择和交换方式。
在这里插入图片描述

  • 首先指针K先指向数组0号位置,K相当于指明一个目标位置。
  • 然后另一个指针min(用来保存遍历中的最小值)从K开始,往后一次比较,找到最小的值,并存储在min中,比较了一轮后,min中存储的数就是整个数组中最小的数字。
  • 这是直接将min中的数字和K指向的数字交换即可。
  • 然后找到数组中第二小的数,让他跟数组中第二个元素交换一下值,以此类推。
#include<iostream>
#include<vector>

using namespace std;

void DataSwap(int& data1, int& data2)
{
	int temp = data1;
	data1 = data2;
	data2 = temp;
}
void SelectionSort(vector<int>& arr)
{
	int n = arr.size();
	if (n < 2)
		return;
	for (int i = 0; i < n - 1; i++)    //从第一个位置开始
	{
		int index = i;
		for (int j = i + 1; j < n; j++)    //寻找最小的数据索引 
			if (arr[j] < arr[index])
				index = j;
		if (index != i)    //如果最小数位置变化则交换
			DataSwap(arr[index], arr[i]);
	}
}


int main() {
	vector<int> arr = { 9,8,7,5,7,3,4,1 };
	SelectionSort(arr);
	for (int i = 0; i < arr.size(); i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
	return 0;
}

3、插入排序(InsertionSort)

  • 将一组数据分成两组,我分别将其称为有序组与待插入组。(玩扑克牌的思想)
  • 每次从待插入组中取出一个元素,与有序组的元素进行比较,并找到合适的位置,将该元素插到有序组当中。
  • 就这样,每次插入一个元素,有序组增加,待插入组减少。直到待插入组元素个数为0。

当然,插入过程中涉及到了元素的移动。每插入一个数都要将它和之前的已经完成排序的序列进行重新排序,也就是要找到新插入的数对应原序列中的位置。
在这里插入图片描述

#include<iostream>
#include<vector>

using namespace std;


void InsertionSort(vector<int>& arr)
{
	int n = arr.size();
	if (n < 2)
		return;
	for (int i = 1; i < n; i++)
	{
		int tmp = arr[i];//记录当前插入值,从待插入组取出第一个元素。 
		int  j = i - 1; //i-1即为有序组最后一个元素(与待插入元素相邻)的下标 
		while (j >= 0 && tmp< arr[j])  //注意判断条件为两个,j>=0对其进行边界限制。第二个为插入判断条件 
		{
			arr[j + 1] = arr[j];//若不是合适位置,有序组元素向后移动 
			j--;
		}
		arr[j + 1] = tmp;//找到合适位置,将元素插入。 
	}
}



int main() {
	vector<int> arr = { 9,8,7,5,7,3,4,1 };
	InsertionSort(arr);
	for (int i = 0; i < arr.size(); i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值