数据结构 --- 排序

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 }
原文地址:https://www.cnblogs.com/luguoshuai/p/9416921.html