zoukankan      html  css  js  c++  java
  • 数据结构 --- 排序

    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 }
  • 相关阅读:
    R_Studio(关联)使用apriori函数简单查看数据存在多少条关联规则,并按支持度降序排序输出
    Unity3D_(游戏)2D坦克大战 像素版
    R_Studio(cart算法决策树)对book3.csv数据用测试集进行测试并评估模型
    R_Studio(决策树算法)鸢尾花卉数据集Iris是一类多重变量分析的数据集【精】
    R_针对churn数据用id3、cart、C4.5和C5.0创建决策树模型进行判断哪种模型更合适
    R_Studio(教师经济信息)逻辑回归分析的方法和技巧
    JavaWeb_Get和Post方法传输数据区别
    JavaWeb_响应和请求数据包
    JavaWeb_使用dom4j解析、生成XML文件
    JavaWeb_ XML文件
  • 原文地址:https://www.cnblogs.com/luguoshuai/p/9416921.html
Copyright © 2011-2022 走看看