排序算法--冒泡、选择、插入排序

1、经典的冒泡排序

外层循环控制大排序次数,

内层循环控制每次大排序的排序次数

一次大排序就可以把最小的数据放在最前面。

1)对数组中的各数据,依次比较相邻的两个元素的大小

2)如果前面的数据大于后面的数据,就交换着两个数据。经过第一轮大排序后,便可把最小的数据排好。

3)然后再用同样的方法吧剩下的数据逐个比较,最后得到从小到大排好的数组。

void BubbleSort(int *a, int len)
{
	int i, j, temp, k;
	for (i = 0; i < len - 1; i++)
	{
		for (j = len - 1; j > i; j--)  // 排好的数据放在了前面(冒出来了),所以新的一轮排序不需要再对下标小于i的数据进行比较
		{
			if (a[j - 1] > a[j])
			{
				temp = a[j - 1];
				a[j - 1] = a[j];
				a[j] = temp;
			}
		}
		for (k = 0; k < len; k++)
			cout << a[k] ;
		cout << endl;
	}
}                

2、选择排序算法

通过选择和交换来实现排序。

1)首先从原始数组中选择最小的一个数据,将其和位于第1个位置的数据交换

2)接着从剩下n-1个数据中选择次小的一个元素跟第2个位置的数据交换

3)然后,不断重复,直到最后两个数据完成交换

void SeclectSort(int *a, int len)
{
	int i, j, k;
	int temp;
	for (i = 0; i < len - 1; i++)
	{
		k = i; // 记录下当前开始比较的位置,下标小于i的位置已经排好序
		for (j = i + 1; j < len; j++)
		{
			if (a[j] < a[k])
				k = j; // 记录下此轮排序中的最小值的下标
		}
		if (k != i) // 将当前大排序中最小的数放在下标为i的位置上
		{
			temp = a[i];
			a[i] = a[k];
			a[k] = temp;
		}
	}
}

3、基于数组的插入排序

1)首先都数组的前两个数据进行从小到大的排序

2)接着将第3个数据与排好序的两个数据比较,将第3个数据插到合适的位置

3)然后,将第4个数据插入到已排好序的前三个数据当中

4)不断重复上述过程,直到把最后一个元素插入到合适位置。

void InsertionSort(int *a, int len)
{
	int i, j, temp;
	for (i = 1; i < len; i++)
	{
		j = i - 1;  //j为当前大排序中的已排序序列的最后一个元素的下标
		temp = a[i]; // temp为当前待插入的数
		while (j >= 0 && temp < a[j]) //j>=0保证不出界,且当前待插入的数temp比a[j]小,则继续寻找temp要插入的位置j
		{
			a[j + 1] = a[j]; // temp值比较小,则a[j]向后移动,并更新位置j
			j--;
		}
		a[j+1] = temp; //退出while的时候j已经做了一次自减(j--),所以退出while代表找到了比temp小元素(下标为j),则将temp放在j的后面。
	}
}

猜你喜欢

转载自blog.csdn.net/Doutd_y/article/details/81911362