冒泡、选择、插入法排序详解

冒泡法排序

冒泡法排序,见名思义,就是像吐泡泡一样,一个个泡泡按照应有的顺序吐到水面上,直至排序完成。

算法详解

对数组中的元素从前到后进行两两比较交换(0和1,1和2,2和3,...n-1和n),每次完成这样的一种操作,根据具体的条件,最大值或最小值已被挪至最后元素,根据n-1次循环完成对数组排序。

算法代码

//冒泡法排序,本例按照升序进行排序
void bubbleSort(int a[], int n)
{
	printf("
冒泡法排序:
");
	int temp = 0;
	for(int i = 1; i < n; i++)		//需进行n-1次排序
	{
		for(int j = 0; j < n - i; j++)//每次循环完毕最大值已挪至最后元素 (n-i)
		{
			if(a[j] > a[j+1])	//两两比较,若前数比后面数大,则进行交换
			{
				temp = a[j];
				a[j] = a[j+1];
				a[j+1] = temp;
			}
		}
	}
}

算法详细排序演示

输入数组数据: 3 6 0 1 4 5 9 7 8 2

第1次: 3 0 1 4 5 6 7 8 2 '9'		//第一次循环排序已将最大值排至最后位置
第2次: 0 1 3 4 5 6 7 2 '8' 9		//依此类推,直至排序完成
第3次: 0 1 3 4 5 6 2 '7' 8 9
第4次: 0 1 3 4 5 2 '6' 7 8 9
第5次: 0 1 3 4 2 '5' 6 7 8 9
第6次: 0 1 3 2 '4' 5 6 7 8 9
第7次: 0 1 2 '3' 4 5 6 7 8 9		//到此实际排序已完成
第8次: 0 1 '2' 3 4 5 6 7 8 9
第9次: 0 '1' 2 3 4 5 6 7 8 9		//程序执行完毕,排序完成

选择法排序

选择法排序,即选择性进行排序,根据特定情况对某个位置数据进行选择最值。

算法详解

选择法排序,即选择性进行排序,为每个位置选择最值进行交换插入,即(数组第1个元素分别和第2、3、... 、n)进行比较,采用打擂台的方式,将最值替换至第1位,再次循环即(第2个元素和3、4、.... 、n)比较,插入次值,也是通过n-1次循环完成排序。

算法代码

//选择法排序
void selectSort(int a[], int n)
{
	printf("
选择法排序:
");
	int temp = 0;
	for(int i = 0; i < n - 1; i++)	//需进行n-1次排序
	{
		for(int j = i + 1; j < n; j++)//每次循环将最小值挪至i的位置下标 
		{
			if(a[i] > a[j])		//进行两两比较,第i个下标位置的值为最小值
			{
				temp = a[i];
				a[i] = a[j];
				a[j] = temp;
			}
		}
	}
}

算法详细排序演示

输入数组数据: 3 6 0 1 4 5 9 7 8 2

第0次: '0' 6 3 1 4 5 9 7 8 2		//第一次循环排序已将最小值排至最前位置
第1次: 0 '1' 6 3 4 5 9 7 8 2		//依次类推,选择性的将最小值放置指定位置
第2次: 0 1 '2' 6 4 5 9 7 8 3
第3次: 0 1 2 '3' 6 5 9 7 8 4
第4次: 0 1 2 3 '4' 6 9 7 8 5
第5次: 0 1 2 3 4 '5' 9 7 8 6
第6次: 0 1 2 3 4 5 '6' 9 8 7
第7次: 0 1 2 3 4 5 6 '7' 9 8
第8次: 0 1 2 3 4 5 6 7 '8' 9		//排序完成

插入法排序

插入法排序,哈哈,这是我在数据结构中新学习的较为简单的排序方法,即向有序数组中进行插入,放置正确位置的一种排序方法。

算法详解

插入法排序,即向有序序列中找到合理位置进行插入数据,从而实现从第一个元素到最后元素全部插入完成排序的过程。第一次外层循环i为1即待插入数据的下标(第二个数据),内层循环j从i的位置开始,使之与前边的数据一一比较,如果小于就交换插入,直至插入到合适的位置,通过n-1次循环将全部数据插入有序序列,完成排序。

算法代码

//插入法排序
void insertionSort(int a[], int n)
{
	printf("
插入法排序:
");
	int temp = 0;
	for(int i = 1; i < n; i++)	//通过n-1次循环将全部数据完成插入
	{
		for(int j = i; j > 0; j--)//每次循环将下标为i的数据从后向前成功插入有序序列 
		{
			if(a[j] < a[j-1])		//若后边数据比前边数据就进行交换插入
			{
				temp = a[j];
				a[j] = a[j-1];
				a[j-1] = temp;	
			}
		}
	}	
} 

算法详细排序演示

输入数组数据: 3 6 0 1 4 5 9 7 8 2

第1次: '3 6' 0 1 4 5 9 7 8 2		//将6插入有序序列(3)中,此时完成插入
第2次: '0 3 6' 1 4 5 9 7 8 2		//将3插入有序序列中(3,6)中,此时完成插入
第3次: '0 1 3 6' 4 5 9 7 8 2		//将1插入有序序列中(0,3,6)中,此时完成插入
第4次: '0 1 3 4 6' 5 9 7 8 2		//将4插入有序序列中(0,1,3,6)中,此时完成插入
第5次: '0 1 3 4 5 6' 9 7 8 2		//依次类推,直至排序完成
第6次: '0 1 3 4 5 6 9' 7 8 2
第7次: '0 1 3 4 5 6 7 9' 8 2
第8次: '0 1 3 4 5 6 7 8 9' 2
第9次: '0 1 2 3 4 5 6 7 8 9'

总结

哈哈,对数组的排序有好多方法,我在此介绍的是比较简单且常用的排序方法,当然啦,这些排序方法仍然可以改进修改,更加提高时间复杂度,增加排序效率。如果有小伙伴对此仍有疑虑或有改进的方法,欢迎评论留言,我看到会第一时间回复大家的,哈哈,加油冲冲冲!

原文地址:https://www.cnblogs.com/gaoliwei1102/p/13153533.html