排序分类
在计算机科学所使用的排序算法通常被分类为:
a)计算的复杂度(最差、平均、和最好性能),依据列表(list)的大小(n)。一般而言,好的性能是O(nlogn),且坏的性能是O(n平方)。对于一个排序理想的性能是O(n)。仅使用一个抽象关键比较运算的排序算法总平均上总是至少需要O(nlogn)。
b)存储器使用量(空间复杂度)(以及其他电脑资源的使用)
c)稳定度:稳定排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序。
d)一般的方法:插入、交换、选择、合并等等。交换排序包含冒泡排序和快速排序。插入排序包含希尔排序,选择排序包括堆排序等。
不稳定排序算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此。不稳定排序算法可以被特别地实现为稳定。作这件事情的一个方式是人工扩充键值的比较,如此在其他方面相同键值的两个对象间之比较,就会被决定使用在原先数据次序中的条目,当作一个同分决赛。然而,要记住这种次序通常牵涉到额外的空间负担。
现在开始,我们要接触高效排序算法了。实践证明,快速排序是所有排序算法中最高效的一种。它采用了分治的思想:先保证列表的前半部分都小于后半部分,然后分别对前半部分和后半部分排序,这样整个列表就有序了。这是一种先进的思想,也是它高效的原因。因为在排序算法中,算法的高效与否与列表中数字间的比较次数有直接的关系,而"保证列表的前半部分都小于后半部分"就使得前半部分的任何一个数从此以后都不再跟后半部分的数进行比较了,大大减少了数字间不必要的比较。但查找数据得另当别论了。
/// 简单排序-冒泡排序 ///</summary>
///<param name="a"></param>
public void BubbleSort(int[] a)
{ int temp = 0; for (int i = 0; i < a.Length - 1; i++) { for (int j = i; j < a.Length; j++) { if (a[j] < a[i]) { temp = a[j]; a[j] = a[i]; a[i] = temp; } } } for (int i = 0; i < a.Length; i++) { Console.WriteLine(a[i]); } }
///<summary>
/// 在排序过程中,执行完最后的排序后,虽然数据已全部排序完备, /// 但程序无法判断是否完成排序,为了解决这一不足,可设置一个标志位flag, /// 将其初始值设置为非0,表示被排序的表是一个无序的表,每一次排序开始前 /// 设置flag值为0,在进行数据交换时,修改flag为非0。在新一轮排序开始时, /// 检查此标志,若此标志为0,表示上一次没有做过交换数据,则结束排序; /// 否则进行排序. ///</summary>
///<param name="array"></param>
public void BubbleSort3(int[] array)
{ int length = array.Length - 1; bool isExchanged = false; for (int i = 0; i < length; i++) { isExchanged = false; for (int j = length; j > i; j--) { if (array[j] > array[j - 1]) { int temp = array[j]; array[j] = array[j - 1]; array[j - 1] = temp; isExchanged = true; } } if (!isExchanged)//一遍比较过后如果没有进行交换则退出循环 break; } foreach (int i in array) { Console.WriteLine(i); } }
冒泡排序Bubble Sort