经典的排序算法有很多种,有的时间复杂度也各不一样。《代码之美》一书的第三章《我从未编写过的最漂亮的代码》还对快速排序代码进行优化精讲,挺优美。这书不错。这次主要来自己动手实现这简单的冒泡排序与插入排序,加深熟练程度。
(一)冒泡排序
基本思想:依次比较相邻的两个数,将小数放在前面,大数放在后面。由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。主要通过两层循环来实现。
时间复杂度为:O(n∧2)
代码实现:
Code
1
2 /// <summary>
3 /// 冒泡排序(小数往前放,大数往后放,相当于气泡往上升)
4 /// </summary>
5 /// <param name="array"></param>
6 public static void BubbleSort(int[] array)
7 {
8 int length = array.Length;
9 for (int i = 1; i < length; i++)
10 {//外层:共需length-1轮
11 ///在进行每趟比较前将flag置成true。
12 /// 如果在比较中发生了数据交换,则将flag置为false,在一趟比较结束后,再判断flag,
13 ///如果它仍为true(表明在该趟比较中未发生一次数据交换)则结束排序,否则进行下一趟比较。
14 bool flag = true;
15 for (int j = length-1; j >=1; j--)
16 {
17 if (array[j] < array[j - 1])
18 {
19 int temp = array[j];
20 array[j] = array[j - 1];
21 array[j - 1] = temp;
22 flag = false;
23 }
24 }
25 if (flag == true)
26 return;
27 }
28
(二)插入排序
1
2 /// <summary>
3 /// 冒泡排序(小数往前放,大数往后放,相当于气泡往上升)
4 /// </summary>
5 /// <param name="array"></param>
6 public static void BubbleSort(int[] array)
7 {
8 int length = array.Length;
9 for (int i = 1; i < length; i++)
10 {//外层:共需length-1轮
11 ///在进行每趟比较前将flag置成true。
12 /// 如果在比较中发生了数据交换,则将flag置为false,在一趟比较结束后,再判断flag,
13 ///如果它仍为true(表明在该趟比较中未发生一次数据交换)则结束排序,否则进行下一趟比较。
14 bool flag = true;
15 for (int j = length-1; j >=1; j--)
16 {
17 if (array[j] < array[j - 1])
18 {
19 int temp = array[j];
20 array[j] = array[j - 1];
21 array[j - 1] = temp;
22 flag = false;
23 }
24 }
25 if (flag == true)
26 return;
27 }
28
基本思想:插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,时间复杂度为O(㎡)。是稳定的排序方法。
其中包括很多种插入排序,包括:直接插入排序,折半插入排序,链表插入排序。
Code