前言

排序方法按原理、其它说明、图示、c++代码案例四个方面来分析

选择排序

原理:将初始序列(A[0]~A[n-1])作为待排序序列,第一趟在待排序序列(A[0]~A[n-1])中找到最小值(或最大值)元素,将其与第一个元素A[0]交换,这样子序列(A[0])已经有序,下一趟在排序在待排序子序列(A[1]~A[n-1])中进行。第i趟排序在待排序子序列(A[i-1]~A[n-1])中找到最小值(或最大值)元素,与该子序列中第一个元素A[i-1]交换。经过 n-1 趟排序后使得初始序列有序。
其他说明:选择排序的最好、最坏和平均情况的时间复杂度都为O(n^2),而且它还需交换元素(n-1)次和移动元素3(n-1)次;它是不稳定的排序算法。
图示

C++代码
/*<2016-12-18>Amusi
Description: Selectiion sort
*/
#include

using namespace std;

void selec_sort(int queue[],int n)
{
	int i, j;
	for (i = 0; i < n - 1;i++)
	{
		int temp;
		for (j = i+1; j < n; j++)
		{
			//获得当前子序列的最小值,并与子序列的首元素交换
			if (queue[j]

插入排序

原理:假设第一个元素排好,并作为一个有序序列,对于未排序序列(剩下的n-1个元素),在有序序列中从后向前扫描,找到相应位置,依次插入该有序序列(元素逐渐增多),每插入一个元素后依然保持该序列有序,经过 n-1 趟排序后使初始序列有序。
其他说明:插入排序在最好的情况下时间复杂度为O(n),比较次数为(n-1)次,移动元素次数是2(n-1);插入排序最差的方法排序;插入排序是稳定的排序算法。(此方法较难理解,需多编写代码理解)
直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列。
例如,已知待排序的一组纪录是:
60,71,49,11,24,3,66
假设在排序过程中,前3个纪录已按关键码值递增的次序重新排列,构成一个有序序列:
49,60,71
将待排序纪录中的第4个纪录(即11)插入上述有序序列,以得到一个新的含4个纪录的有序序列。首先,应找到11的插入位置,再进行插入。可以讲11放入数组的第一个单元r[0]中,这个单元称为监视哨,然后从71起从右到左查找,11小于71,将71右移一个位置,11小于60,又将60右移一个位置,11小于49,又再将49右移一个位置,这时再将11与r[0]的值比较,11≥r[0],它的插入位置就是r[1]。假设11大于第一个值r[1]。它的插入位置应该在r[1]和r[2]之间,由于60已经右移了,留出来的位置正好留给11.后面的纪录依照同样的方法逐个插入到该有序序列中。若纪录数n,续进行n-1趟排序,才能完成。
直接插入排序的算法思路:
(1) 设置监视哨r[0],将待插入纪录的值赋值给r[0];
(2) 设置开始查找的位置j;
(3) 在数组中进行搜索,搜索中将第j个纪录后移,直至r[0].key≥r[j].key为止;
(4) 将r[0]插入r[j+1]的位置上。
图示

C++代码
/*<2016-12-18>Amusi
Description: Insert sort
*/
#include

using namespace std;
//插入排序函数
void Insert_sort(int queue[],int n)
{
	int i, j, temp;
	for (i = 1; i < n;i++)	//n-1趟
	{
		temp = queue[i];	//待插入元素——监视哨
		for (j = i - 1; j >= 0 && queue[j]>temp; j--)//从后向前(即从右向左)
		{
			queue[j + 1] = queue[j];	//右移
		}
		queue[j + 1] = temp;//
	}
}

void print(int queue[],int n)
{
	for (int i = 0; i < n; i++)
	{
		cout << queue[i] << "\t";
	}
	cout << endl;
}

int main()
{
	int queue1[] = { 3, 4, 1, 2, 4, 67, 213, 13, 123, 34, 1, 99 };
	int N = sizeof(queue1) / sizeof(int);
	cout << "未排序的序列:\t";
	print(queue1, N);
	
	Insert_sort(queue1, N);

	cout << "排序后的序列:\t";
	print(queue1, N);

	system("pause");
	return 0;
}

冒泡排序

原理:第一趟在序列(A[0]~A[n-1])中从前往后进行两个相邻元素的比较,若后者小,则交换,比较 n-1 次;第一趟排序结束,最大元素被交换到A[n-1]中,下一趟排序只需要在子序列(A[0]~A[n-2])中进行;冒泡排序最多进行 n-1 趟。基本的冒泡排序可以利用旗标的方式稍微减少一些比较的时间,当寻访完序列后都没有发生任何的交换动作,表示排序已经完成,而无需再进行之后的比较与交换动作。 其他说明:冒泡排序最好的情况下只需进行一趟排序,(n-1)次比较,此时的时间复杂度为O(n),无需移动元素;最坏的情况下进行 n-1 趟排序,时间复杂度为O(n2);冒泡排序是稳定的排序算法

快速排序


附录

排序方法比较

插入排序&选择排序:http://blog.csdn.net/booirror/article/details/45339387
冒泡排序:http://blog.csdn.net/booirror/article/details/45336785
快速排序:http://blog.csdn.net/booirror/article/details/45342857
其它:https://zhidao.baidu.com/question/383709870.html

更多推荐