1、稳定排序和不稳定排序
相等的两个元素在排序前后的相对位置不发生变化称之为稳定排序,否则,是不稳定排序。
2、内排序和外排序
排序的过程中,待排序的记录全部在内存中称之为内排序,否则称之为外排序。
而数据结构中涉及的排序基本都指内排序。
3、影响内排序性能的主要因素:
时间性能、辅助空间、算法本身的复杂度
4、主要分类:
插入排序、交换排序、选择排序、归并排序
5、按照算法的复杂度分为两大类:
简单算法---冒泡排序、简单选择排序、直接插入排序
改进算法---希尔排序、堆排序、归并排序、快速排序
1 using System; 2 using System.Collections; 3 using System.Collections.Generic; 4 5 namespace Test 6 { 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 List<int> list = new List<int> { 12, 0, 5, 6, 41, -5 }; 12 13 QuickSort(list, 0, list.Count - 1); 14 15 for (int i = 0; i < list.Count - 1; i++) 16 Console.WriteLine(list[i]); 17 18 Console.ReadKey(); 19 } 20 21 //冒泡排序(Bubble Sort): 22 //它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小; 23 //如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾! 24 //采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止! 25 static void BubbleSort(List<int> list) 26 { 27 int i, j; 28 bool isBreak = false; 29 for (i = list.Count - 1; i > 0; --i) 30 { 31 isBreak = true; 32 for (j = 0; j < i; ++j) 33 { 34 if (list[j] > list[j + 1]) 35 { 36 isBreak = false; 37 int temp = list[j] + list[j + 1]; 38 list[j] = temp - list[j]; 39 list[j + 1] = temp - list[j]; 40 } 41 } 42 43 if (isBreak) 44 break; 45 } 46 } 47 48 //直接插入排序(Straight Insertion Sort): 49 //把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素, 50 //无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置, 51 //使之成为新的有序表,重复n-1次可完成排序过程。 52 static void StraightInsertSort(List<int> list) 53 { 54 int i, j, k; 55 int iMax = list.Count - 1; 56 57 for (i = 1; i <= iMax; ++i) 58 { 59 //查找合适的插入位置 60 for (j = i - 1; j >= 0; --j) 61 { 62 if (list[j] < list[i]) 63 break; 64 } 65 66 //如果找到了一个合适的位置 67 if (j != i - 1) 68 { 69 //移动i位置之前,j位置之后的元素 70 int temp = list[i]; 71 for (k = i - 1; k > j; --k) 72 list[k + 1] = list[k]; 73 74 //将i位置的元素插入寻得的合适位置,思考为什么是 j+1 75 list[j + 1] = temp; 76 } 77 } 78 } 79 80 //选择排序(Selection sort)是一种简单直观的排序算法。 81 //首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置; 82 //再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾。 83 //以此类推,直到所有元素均排序完毕。 84 static void SelectionSort(List<int> list) 85 { 86 int i, j, min; 87 int count = list.Count; 88 for (i = 0; i < count; ++i) 89 { 90 min = i; 91 92 for (j = i + 1; j < count; ++j) 93 { 94 if (list[j] < list[min]) 95 min = j; 96 } 97 98 if (min != i) 99 { 100 int temp = list[min] + list[i]; 101 list[i] = temp - list[i]; 102 list[min] = temp - list[i]; 103 } 104 } 105 } 106 107 //快速排序(Quick Sort)使用分治法策略。 108 //它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。 109 //再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 110 //快速排序流程: 111 //(1) 从数列中挑出一个基准值。 112 //(2) 将所有比基准值小的摆放在基准前面,所有比基准值大的摆在基准的后面(相同的数可以到任一边);在这个分区退出之后,该基准就处于数列的中间位置。 113 //(3) 递归地把"基准值前面的子数列"和"基准值后面的子数列"进行排序。 114 static void QuickSort(List<int> list, int lBorder, int rBorder) 115 { 116 if (lBorder < rBorder) 117 { 118 int i, j, temp; 119 i = lBorder; 120 j = rBorder; 121 122 temp = list[i]; //相当于腾出一个位置 123 while (i < j) 124 { 125 //从右向左寻找第一个小于 temp 的值 126 while (i < j && list[j] > temp) 127 --j; 128 if (i < j) 129 { 130 list[i] = list[j]; 131 ++i; 132 } 133 134 135 //从左向右寻找第一个大于 temp 的值 136 while (i < j && list[i] < temp) 137 ++i; 138 if (i < j) 139 { 140 list[j] = list[i]; 141 --j; 142 } 143 } 144 145 list[i] = temp; 146 147 QuickSort(list, lBorder, i - 1); 148 QuickSort(list, i + 1, rBorder); 149 } 150 } 151 } 152 }