总体上讲排序有以下五种:以身边常见的扑克牌为例来理解比较容易些。
插入排序:(基本思想)每一趟将一个待排序的记录,按照其关键字大小插入到已经安排好的一组记录的适当位置上,直到所有待排序记录全部插入为止。例如 希尔(shell)排序。
(举例)打扑克牌在抓牌时要保证抓过的牌有序排列,则每抓一张牌,就插入到合适的位置,直到抓完牌为止,即可得到一个有序序列。
交换排序:(基本思想)两两比较待排序记录的关键字,一旦发现两个记录不满足次序要求时则进行交换,直到整个序列全部满足要求为止。例如 冒泡排序和快速排序。
选择排序:(基本思想)每一趟从待排的记录中选出关键字最小的记录,按顺序放在已排序的记录序列的最后,直到全部排完为止。例如 堆排序。
归并排序:(基本思想)将两个或两个以上的有序表合并成一个有序表的过程。
基数排序:(基本思想)和前面所述各类比较方法完全不同的一种排序方法。前面各类排序方法都是建立在关键字比较的基础上,而基数排序不比较关键字中各位的值,通过对待排序记录进行若干趟“分配”和“收集”来实现排序的。
- 冒泡排序
- 快速排序
- Shell排序
- 堆排序
交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。
1.冒泡排序-BubbleSorting
将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。
下面这个动画斜过来气泡往上走会更直观:
方法A:(比较直白、跟算法思想很贴切) 第一遍是数组的第一个元素跟第二个比较,第二个元素跟第三个元素比较。。。最终把最小的放到第一个位置;第二遍是数组的第二个元素跟第三个比较,第三个元素跟第四个比较。。。最终把次小的放到第二个位置,。。。以此类推。。。每一遍都是相邻两个元素比较。
1 using System; 2 3 namespace SortFunction 4 { 5 class BubbleSort 6 { 7 static void Main(string[] args) 8 { 9 int[] a = { 10, 1, 2, 3, 4, 9 }; 10 BubbleSort BS = new BubbleSort(); 11 int[] b = BS.sortArray(a); 12 for (int i = 0; i < b.Length; i++) 13 { 14 Console.WriteLine(b[i]); 15 } 16 Console.ReadLine(); 17 } 18 19 int[] sortArray(int[] inputArray) 20 { 21 for (int i = 0; i < inputArray.Length; i++) 22 { 23 // exchange can speed up the sorting in specail occasion. 24 bool exchange = false; 25 for (int j = i; j < inputArray.Length - 1; j++) 26 { 27 if (inputArray[j] > inputArray[j + 1]) 28 { 29 int tmp = inputArray[j + 1]; 30 inputArray[j + 1] = inputArray[j]; 31 inputArray[j] = tmp; 32 exchange = true; 33 } 34 } 35 36 if (!exchange) 37 { 38 break; 39 } 40 } 41 return inputArray; 42 } 43 } 44 }