排序小结 sort

排序小结

排序算法是基础之基础。在这里小结一下。方便自己查阅和学习。

1.冒泡排序(BubbleSort)

思想:比较相邻的两个元素,如果前面的元素大于后面的元素,交换之。

思路:采用双层循环。外循环控制要处理多少趟。里面循环用来做元素的交换操作。注意上下界。

稳定性:稳定

时间复杂度:O(n2)

void bubbleSort(int a[], int size)
{
	int tmp;
	for (int i = 0; i < size; i++)
	{	//每一趟都会把最大的元素放入最右边的位置
		//最右边的位置会一点点往左移动
		for (int j = 0; j < size - i - 1; j++)
		{
			if (a[j] > a[j + 1])
			{
				tmp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = tmp;
			}
		}
	}
}

2.快速排序(quickSort)

思想:找到第一个元素的最终位置,然后对数组进行分割,对左边的进行快排,对右边的进行快排。

思路:采用递归,需要一个辅助函数findPos()来找到某一个元素的最终位置。

稳定性:不稳定

时间复杂度:有时O(nlogn),最坏情况是已经排好序,这样时间复杂度为O(n2)

伪算法

/*

* 快速排序(伪算法) 2016-08-14 11:01:34

* 1.先找到第一个元素的最终位置

* 2.对第一个元素的最终位置之前的元素,进行快速排序。

* 3.对第一个元素的最终位置之后的元素,进行快速排序。

*

*/

int findPos(int a[],int low,int high)
{
	int val = a[low];
	while(low < high)
	{
		//因为val取的是最前面的值,所以先从后往前遍历比较
		while(low < high && a[high] >= val)
			high--;
		a[low] = a[high];//将后面较小值赋值给前面已经做好备份的位置上
		//然后从前往后遍历比较
		while(low < high && a[low] <= val)
			low++;
		a[high] = a[low];//将前面较大值赋值给后面已经做好备份的位置上
	}
	a[low] = val;
	return low;
}

void quickSort(int a[],int low,int high)
{
	if(low < high)
	{
		int pos = findPos(a,low,high);
		quickSort(a,low,pos-1);
		quickSort(a,pos+1,high);
	}
}

3.直接插入排序(insertSort)也叫选择插入排序

思想:将第i个元素插入到前面i-1个已排好序的记录中。直到所有的元素都排一次。

思路:见伪算法

稳定性:稳定

时间复杂度:O(n2)

伪算法

/*

* 插入排序(伪算法) 2016-08-14 12:23:09

* 1. 将相邻的两个元素比较,如果前面的数大于后面的数,则交换。

*    直到找到前面的数小于后面的,就把这个值插入到这个位置。

* 2. 循环1,直到所有的元素都有序排列。

*

*/

void insertSort(int a[], int size)
{
	int i, j, tmp;
	for (i = 0; i < size; i++)
	{
		tmp = a[i];
		for (j = i - 1; j >= 0 && a[j] > tmp; j--)
		{
			a[j+1] = a[j];
		}
		a[j + 1] = tmp;
	}
}

4.选择排序(selectSort)

思想:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在待序列的起始位置。

思路:见伪算法

稳定性:不稳定

时间复杂度:O(n2)

伪算法

/*

* 选择排序(伪算法) 2016-08-14 13:08:50

* 1. 工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在待序列的起始位置。

* 2. 循环1,直到全部待排序的数据元素排完。

*

*/

void selectSort(int a[], int size)
{
	int currentSmallIndex;//记录待排序队列中最小元素的下标
	int tmp;//记录最小元素的大小
	for (int i = 0; i < size; i++)
	{
		tmp = a[i];
		currentSmallIndex = i;
		for (int j = i + 1; j < size; j++)
		{
			if (a[j] < tmp)
			{
				currentSmallIndex = j;
				tmp = a[j];
			}
		}
		a[currentSmallIndex] = a[i];
		a[i] = tmp;
	}
}

5.归并排序(mergeSort)

思想:将数组递归分成2半,知道数组的长度为1,然后将分成2半的数组合并。

思路:需要使用辅助函数merge()来合并

稳定性:稳定

时间复杂度:O(n2)

伪算法

/*

1.将数组分成左右两半

2.递归1,直道只剩1个元素的时候,然后合并。

*/

void merge(int a[], int start, int end)
{
	int mid = (start + end) / 2;
	int left, right;
	int * temp = new int[end - start + 1];

	int k = 0;//临时数组的下标
	left = start;
	right = mid + 1;

	while (left <= mid && right <= end)
	{
		while ((left <= mid && right <= end) && (a[left] < a[right]))
			temp[k++] = a[left++];

		while ((left <= mid && right <= end) && (a[right] < a[left]))
			temp[k++] = a[right++];
	}

	while (left <= mid)
		temp[k++] = a[left++];

	while (right <= end)
		temp[k++] = a[right++];

	//将临时数组中的元素,找到原数组的位置,按位赋值过去。
	//这里需要注意原数组的起始位置是start,而不是0
	for (int i = start, k = 0; i <= end; i++, k++)
		a[i] = temp[k];

	delete[] temp;
}

void mergeSort(int a[], int start, int end)
{
	if (start < end)
	{
		int mid = (start + end) / 2;
		mergeSort(a, start, mid);	//左数组合并排序
		mergeSort(a, mid + 1, end);	//右数组合并排序
		merge(a, start, end);		//整体排序
	}
}

排序总结未完待续。

2016-08-14 16:11:27

时间: 2024-08-04 16:46:36

排序小结 sort的相关文章

排序(sort包)

使用 sort.Interface 来排序 排序是一个在很多程序中广泛使用的操作.sort 包提供了针对任意序列根据任意排序函数原地排序的功能. 这样的设计号称并不常见.在很多语言中,排序算法跟序列数据类型绑定,排序函数跟序列元素类型绑定.但 Go 语言的 sort.Sort 函数对序列和其中元素的布局无任何要求,它使用 sort.Interface 接口来实现. 接口实现 一个原地排序算法需要知道三个信息: 序列长度 比较两个元素的含义 如何交换两个元素 所以 sort.Interface 接

希尔排序Shell sort

希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分, 第一部分,希尔排序介绍 第二部分,如何选取关键字,选取关键字是希尔排序的关键 第一块希尔排序介绍 准备待排数组[6 2 4 1 5 9] 首先需要选取关键字,例如关键是3和1(第一步分成三组,第二步分成一组),那么待排数组分成了以下三个虚拟组: [6 1]一组 [2 5]二组 [4 9]三组 看仔细啊,不是临近的两个数字分组,而是3(分成了三组)的倍数的数字分成了一组, 就是每隔3个数取一个,每隔三个再取一个,这样取出来的数

算法学习 - STL的p排序函数(sort)使用

排序函数sort() 这个函数是STL自带的,功能很强大~ 这里教下使用方法. sort()有三个参数,第一个是排序的起始位置,第二个是排序的结束位置,第三个是排序的判断函数.函数原型为: sort(<#_RandomAccessIterator __first#>, <#_RandomAccessIterator __last#>, <#_Compare __comp#>) 这个就是原型了~ 使用方法 首先假设我们有一个vector<int> vec;向量

&lt;转&gt;python字典排序 关于sort()、reversed()、sorted()

一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a','have','I'])) #['I', 'have', 'a', 'dream'] 2.让人糊涂的sort()与sorted() 在Python 中sorted是内建函数(BIF),而sort()是列表类型的内建函数list.sort(). sorted() sorted(iterable[,

160317(二)、按sort排序,sort为空的在后面

按sort排序,sort为空的在后面 select * from 表名 order by (case when sort is null or sort='' then 1 else 0 end),sort select  t.*, t.rowid from hs_tr_goods_attach_rel t order by (case when t.goods_order is null or t.goods_order = '' then 1 else 0 end), t.goods_ord

python 字典排序 关于sort()、reversed()、sorted()

一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a','have','I'])) #['I', 'have', 'a', 'dream'] 2.让人糊涂的sort()与sorted() 在Python 中sorted是内建函数(BIF),而sort()是列表类型的内建函数list.sort(). sorted() sorted(iterable[,

Linux排序命令sort(转)

Linux sort命令用于将文本文件内容加以排序.sort可针对文本文件的内容,以行为单位来排序. 语法 sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件] 参数说明: -b 忽略每行前面开始出的空格字符. -c 检查文件是否已经按照顺序排序. -d 排序时,处理英文字母.数字及空格字符外,忽略其他的字符. -f 排序时,将小写字母视为大写字母. -i 排

C++ 排序函数 sort(),qsort()的使用方法

想起来自己天天排序排序,冒泡啊,二分查找啊,结果在STL中就自带了排序函数sort,qsort,总算把自己解脱了~ 所以自己总结了一下,首先看sort函数见下表: 函数名 功能描写叙述 sort 对给定区间全部元素进行排序 stable_sort 对给定区间全部元素进行稳定排序 partial_sort 对给定区间全部元素部分排序 partial_sort_copy 对给定区间复制并排序 nth_element 找出给定区间的某个位置相应的元素 is_sorted 推断一个区间是否已经排好序 p

数据结构杂谈(二)简单有趣的地精排序Gnome sort

很早之前便听说过地精排序的名字,今天自己看来一下,发现这是一种非常简单而且有趣的排序算法. 为什么叫地精排序? 地精排序在2000年由Dr. Hamid Sarbazi-Azad 提出的时候被称作 stupid sort,可见其思想的简单性.后来,这个算法被Dick Grune 描述成地精排序Gnome sort. 故事背景: Here is how a garden gnome sorts a line of flower pots.  Basically, he looks at the f