简单排序——插入、冒泡、选择

插入排序:

基本原理 :

直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列,算法适用于少量数据的排序,时间复杂度为O(n^2)。

步骤:

a、 从第一个元素开始,该元素可以认为已经被排序
b、 取出下一个元素 在已经排序的元素序列中从后向前扫描
c、 如果该元素(已排序)大于新元素,将该元素移到下一位置
d、 重复c步骤直到找到已排序的元素小于或者等于新元素的位置
e 、将新元素插入到该位置
f 、重复步骤b

选择排序:

原理

a 、首先在未排序序列中找到最小元素,存放到排序序列的起始位置,
b 、再从未排序元素中继续寻找最小元素,然后放到排序序列尾
c 、一次类推 直到所有元素都排序完毕

步骤

a、首先让i=下标0,让min=i ,即将数组第一个元素当作最小值。
b、然后让j从i+1开始,往后依次比较arr[min]和arr[j],找到最小的值,并存储在min中,比较了一轮后,min中存储的数就是整个数组中最小的数字。
c、如果i不等于min,说明i之后有更小值,就直接将min中的数字和i指向的数字交换即可。
d、然后找到数组中第二小的数,让他跟数组中第二个元素交换一下值,以此类推。

冒泡排序

排序原理:

a、重复地走访过要排序的数列,一次比较两个元素,如果他们顺序错误就把他们交换过来
b、走访数列的工作就是重复地进行 直到没有再需要交换,也就是说该数列已经排序完成
c、 这个算法就是因为越小的元素会经由交换慢慢浮到数列的顶端

步骤:

a、将序列当中的左右元素,依次比较,保证右边的元素始终大于左边的元素;( 第一轮结束后,序列最后一个元素一定是当前序列的最大值;)
b、对序列当中剩下的n-1个元素再次执行步骤1。
c、持续每次对越来越少的元素进行重复上面的步骤直到没有任何一对数字需要比较

复杂度,稳定性分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<iostream>
using namespace std;

/***插入排序就是将一个记录根据大小关系插入到已经排好序的有序表中,从而得到一个新的有序表***/
void InsertSort(int arr[],int n)	// arr[10] = { 1,5,6,4,3,2,7,9,8,0 }
{
	int j, temp;
	for (int i = 1; i < n; i++)		//从1到n循环,即 将1到n中的数依次插入到前面已排好的序列
	{
		temp = arr[i];		//temp为要插入的数,因为下面的后移可能会覆盖掉序列后一个数(即要被插入的数),所以用temp保存,不然之后要插入的数值就不是原来的数了
		
		j = i - 1;			//此时的j为 排好的序列的最后一个下标,因为涉及到元素后移,所以要插入的数与排好序列的最后一个数比较,
		while (j >= 0 && temp<arr[j])	//从排好的序列最后一个数开始,要插入的值每小于一个数,向后移动一个元素,腾出合适位置将值插入
		{
			arr[j + 1] = arr[j];//后移元素
			j--;			
		}						//while循环后的j为小于temp且最近的一个下标

		arr[j + 1] = temp;	//将temp值插入赋值到j后一个元素
	}
}

/***选择排序就是通过n-i次关键字间的比较,从n-i+1个记录中选择关键字最小的记录,并和第i个记录交换***/
void SelectSort(int arr[], int n)
{
	int min,temp;
	for (int i = 0; i < n; i++)		
	{
		min = i;		//将当前下标定义为最小值下标
		for (int j = i + 1; j < n; j++)	//循环i之后的数据,找到数组最小值
		{
			if (arr[min] > arr[j])	//如果有小于当前最小值的关键字
				min = j;			//就将这个关键字的下标赋值给min
		}
		if (i != min)				//如果i不等于min,说明i之后有更小值,则将这个最小值与arr[i]交换
		{
			temp = arr[i];
			arr[i] = arr[min];
			arr[min] = temp;
		}
	}
}

/***冒泡排序是一种交换排序,基本思想是:两两比较相邻的关键字,如果反序就交换,直到没有反序的记录为止***/
int BubbleSort(int arr[], int n)	//升序		 arr[10] = { 1,5,6,4,3,2,7,9,8,0 }
{
	int temp;
	bool flag = true;
	for(int i=0;i<n-1;i++)		//外循环共循环n-1轮,来找出n-1个最大值
	{
		flag = false;//每次循环都先置为false,即认为不会发生交换
		for(int j=0;j<n-i-1;j++)//内循环选出0到n-i-1中的最大值
		{
			if (arr[j] > arr[j + 1])//不断交换,最后一个数为最大值
			{
				temp = arr[j + 1];
				arr[j + 1] = arr[j];
				arr[j] = temp;
				flag = true;//发生交换
			}
		}
		if (!flag)	//如果还是false,证明没有交换,后面的就没必要扫描了
			return 0;
	}
}
int main()
{
	int arr[10] = { 1,5,6,4,3,2,7,9,8,0 };

	BubbleSort(arr,10);		//冒泡排序
	for (int i = 0; i < 10; i++)
		cout << arr[i] << "  ";

	cout << endl;
	InsertSort(arr, 10);	//插入排序
	for (int i = 0; i < 10; i++)
		cout << arr[i] << "  ";

	cout << endl;
	SelectSort(arr, 10);	//选择排序
	for (int i = 0; i < 10; i++)
		cout << arr[i] << "  ";

	return 0;
}

版权声明:本文为CSDN博主「fanfanfanfankeli」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39380590/article/details/82113421

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值