浅谈三种排序技术——直接插入、冒泡、简单选择

浅谈三种基本排序技术——直接插入、冒泡、简单选择排序

  • 排序的基本概念
  • 插入排序———直接插入排序InsertSort
  • 交换排序———冒泡排序BubbleSort
  • 选择排序———快速排序SelectSort

排序的基本概念

将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序。

常见排序算法
快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。

在这里插入图片描述

笔者研究了三种基本排序技术——直接插入、冒泡、简单选择。

插入排序———直接插入排序(InsertSort)

基本思想:
每次将一个待排序的记录按其关键码的大小插入到一个已排好序的有序序列中,直到全部记录排好序。

算法分析

  1. 从第一个元素开始,该元素可认为已被排序;
  2. 取出下一个元素,在已排序的元素序列中从后向前扫描;
  3. 如果该元素(已排序)大于新元素,将元素移到下一个位置;
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  5. 将新元素插入到该位置后;
  6. 重复步骤2~5
    在这里插入图片描述

代码实现:

//直接插入算法
void InsertSort(int r[], int n)
{
	int i, j;
	int count = 1;//计数count
	for (i = 2;i <= n;i++)
	{
		r[0] = r[i];//哨兵
		for (j = i - 1;r[0] < r[j];j--)//从后向前扫描
		{
			r[j + 1] = r[j];
		}
		r[j + 1] = r[0];//在找到的位置之后插入
		cout << "第" << count << "次:" << endl;
		for (j = 1;j <= i;j++)
			cout << r[j] << " ";
		count++;
		cout << endl<<endl;
	}
}

比较排序———冒泡排序(BubbleSort)

基本思想: 重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来,直到没有需要再进行交换。
算法分析:

  1. 初始时有序区为空,无序区包括所有待排查的记录;
  2. 对无序区从前向后依次将相邻记录的关键码进行比较,若反序则交换;
  3. 重复执行2,直到无序区中没有反序的记录

在这里插入图片描述

代码实现:

void BubbleSort(int r[], int n)
{
	int exchange = n;//记录每次的交换位置
	int bound = n;//无序区的最后一个记录
	while (exchange != 0)//当有交换时
	{
		int j;
		bound = exchange;
		exchange = 0;
		for (j = 1;j < bound;j++)
		{
			if (r[j] > r[j + 1])
			{
				r[0] = r[j];
				r[j] = r[j + 1];
				r[j + 1] = r[0];
				exchange = j;
			}//交换,用exchange记录每次交换的位置
		}
		cout << "[ ";
		for (j = 1;j <bound;j++)
			cout << r[j] << " ";
		cout << "] ";
		for (j = bound;j <= n;j++)
			cout << r[j] << " ";
		cout << endl << endl;
	}
}

选择排序———简单选择排序(SelectSort)

基本思想: 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

算法分析:

  1. 初始状态:无序区为R[1…n],有序区为空;
  2. 第i趟排序(i=1,2,3…n-1)开始时,有序区和无序区分别为R[1…i-1]和R(i…n)。该趟排序从无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1…i]和R[i+1…n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区
  3. 不断重复2,直到无序区只剩下一个记录为止
    在这里插入图片描述
//简单选择排序
void SelectSort(int r[], int n)
{
	int i, j, index;
	int count = 0;//记录趟数
	for (i = 1;i < n;i++)
	{
		index = i;//记录每趟关键码最小记录的位置
		for (j = i + 1;j <= n;j++)
		{
			if (r[j] < r[index])
				index = j;
		}
		if (index != i)
		{
			r[0] = r[i];
			r[i] = r[index];
			r[index] = r[0];
		}
		count++;
		cout << "第" << count << "趟:";
		for (int m = 1;m <= n;m++)
			cout << r[m] << " ";
		cout << endl << endl;
	}

}

测试函数

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
const int Max = 10;

void Creat(int r[], int n)
{
	int i = 0;
	r[0] = 0;
	srand(time(NULL));
	for (i = 1;i <= Max;i++)
		r[i] = 1 + rand() % 100;
}

//直接插入算法
void InsertSort(int r[], int n)
{
	int i, j;
	int count = 1;
	for (i = 2;i <= n;i++)
	{
		r[0] = r[i];
		for (j = i - 1;r[0] < r[j];j--)
		{
			r[j + 1] = r[j];
		}
		r[j + 1] = r[0];
		cout << "第" << count << "次:" << endl;
		for (j = 1;j <= i;j++)
			cout << r[j] << " ";
		count++;
		cout << endl<<endl;
	}
}

//冒泡排序算法
void BubbleSort(int r[], int n)
{
	int exchange = n;
	int bound = n;
	while (exchange != 0)
	{
		int j;
		bound = exchange;
		exchange = 0;
		for (j = 1;j < bound;j++)
		{
			if (r[j] > r[j + 1])
			{
				r[0] = r[j];
				r[j] = r[j + 1];
				r[j + 1] = r[0];
				exchange = j;
			}
		}
		cout << "[ ";
		for (j = 1;j <bound;j++)
			cout << r[j] << " ";
		cout << "] ";
		for (j = bound;j <= n;j++)
			cout << r[j] << " ";
		cout << endl << endl;
	}
}

//简单选择排序
void SelectSort(int r[], int n)
{
	int i, j, index;
	int count = 0;//记录趟数
	for (i = 1;i < n;i++)
	{
		index = i;//记录每趟关键码最小记录的位置
		for (j = i + 1;j <= n;j++)
		{
			if (r[j] < r[index])
				index = j;
		}
		if (index != i)
		{
			r[0] = r[i];
			r[i] = r[index];
			r[index] = r[0];
		}
		count++;
		cout << "第" << count << "趟:";
		for (int m = 1;m <= n;m++)
			cout << r[m] << " ";
		cout << endl << endl;
	}
}
#include<iostream>
using namespace std;
#include"Sort.h"

int main()
{
	int a[Max + 1] = { 0 };
	int b[Max + 1] = { 0 };
	int c[Max + 1] = { 0 };
	int i = 0;
	int choice;
	Creat(a, Max);
	for (i = 1;i <= Max;i++)
	{
		b[i] = a[i];
		c[i] = a[i];
	}
	cout << "\t\t\t\t\t对于无序序列:" << endl;
	cout << "\t\t\t\t\t";
	for (i = 1;i <= Max;i++)
		cout << a[i] << " ";
	cout << endl << endl;
	cout << "\t\t\t\t\t*****************************" << endl;
	cout << "\t\t\t\t\t1.执行直接插入排序:" << endl;
	cout << "\t\t\t\t\t2.执行冒泡排序:" << endl;
	cout << "\t\t\t\t\t3.执行简单选择排序:" << endl;
	cout << "\t\t\t\t\t*****************************" << endl;
	cout << "\t\t\t\t\t请输入编号(1-4):" << endl;
	cin >> choice;
	switch (choice)
	{
	case 1:
	{
		cout << "下面执行直接插入排序:" << endl << endl;
		InsertSort(b, Max);
		cout << "排序后结果为:" << endl;
		for (i = 1;i <= Max;i++)
			cout << b[i] << " ";
		cout << endl << endl;
		break;
	}
	case 2:
	{
		cout << "下面执行冒泡排序:" << endl << endl;
		BubbleSort(b, Max);
		cout << "排序后结果为:" << endl;
		for (i = 1;i <= Max;i++)
			cout << b[i] << " ";
		cout << endl << endl;
		break;
	}
	case 3:
	{
		cout << "下面执行简单选择排序:" << endl << endl;
		SelectSort(c, Max);
		cout << "排序后结果为:" << endl;
		for (i = 1;i <= Max;i++)
			cout << c[i] << " ";
		cout << endl << endl;
		break;
	}
	default:
	{
		cout << "请重新输入!" << endl;
		break;
	}
	}
}

测试结果截图:
在这里插入图片描述

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

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页