概述

  看了几天的排序内容,现在和大家分享一些常见的排序方法。

  啥是排序?  

个人理解的排序:通过对数组中的值进行对比,交换位置最终得到一个有序的数组。排序分为内存排序和外部排序。本次分享排序方法都为内存排序。

啥是排序的稳定性?

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。

   常见排序:

  冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序。

来张图展示一下种排序的关系:

冒泡排序(Bubble Sort)

排序思想:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。

复杂度:O(n^2)。

稳定性:稳定。

冒泡排序是我最早接触的排序算法,理解起来比较简单。排序入门级,容易理解,通过不断交换位置来排序。

代码实例:

int[] list = { , , , , , ,  };
int temp;
for (int i = ; i < list.Length; i++)
{
for (int j = i + ; j < list.Length; j++)
{
if (list[i] > list[j])
{
temp = list[i];
list[i] = list[j];
list[j] = temp;
}
}
}
Console.WriteLine("冒泡排序的结果:{0}", string.Join(",", list));

第一个for循环取数据中一个值list[i],第二个for循环已第一个for循环中的下一个值(j=i+1)开始取值list[j]。然后依次对比两值的大小list[i] > list[j],如果数组中前面的值大于后面的值,替换他两的位置。始终保持数组中左边的值小于右边的值。

冒泡排序还有其他很多版本这里就不一一分享。

选择排序 (Simple Selection Sort)

排序思想:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。

复杂度:O(n^2)。

稳定性:稳定。

代码实例:

int[] list = { , , , , , ,  };
int minIndex, temp;
for (int i = ; i < list.Length; i++)
{
minIndex = i; /*把当前循环的值认为是最小值*/
for (int j = i + ; j < list.Length; j++)
{
if (list[j] < list[minIndex])
{
minIndex = j; /*进过N次循环我们找到最小值并赋值给minIndex*/
}
} if (minIndex!=i)
{
temp = list[minIndex]; /*把当前循环出的最小值和list[i]替换。实现左边数据比右边数据要小*/
list[minIndex] = list[i];
list[i] = temp;
}
} Console.WriteLine("选择排序的结果:{0}", string.Join(",", list));

第一个for循环数组中元素list[i],把当前循环的值默认为是最小值。记录下标赋值给minIndex。第二个for循环已第一个for循环中的下一个值(j=i+1)开始取值list[j]。然后依次和list[minIndex]对比,如果list[j]<list[minIndex]把循环中j的下标赋值给minIndex(保持minIndex为循环中最小值的下标)。到第二个for循环结束,然后替换当前循环的值list[i]和list[minIndex]的位置。始终保持数组中左边的值小于右边的值。

选择排序相对冒泡排序交换位置次数少,排序性能略优冒泡排序。

直接插入排序 (Straight Insertion Sort)

排序思想

每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
第一趟比较前两个数,然后把第二个数按大小插入到有序表中;
第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。

复杂度:O(n^2)。

稳定性:稳定。

代码实例:

int[] list = { , , , , , ,  };
int temp, j;
for (int i = ; i < list.Length; i++) /*从数据第二位开始循环 [无序序列] */
{
if (list[i] < list[i - ])
{
temp = list[i];
for (j = i - ; j >= && temp < list[j]; j--) /*[有序序列] */
{
list[j + ] = list[j];
}
list[j + ] = temp;
}
}
Console.WriteLine("直接插入排序的结果:{0}", string.Join(",", list));

第一个for循环(从数组第二位置开始循环)数组中元素list[i],如果循环的当前值list[i]比数组中上一个值list[i-1]要小,声明临时变量temp记录list[i]。然后根据第一个for循环的i值,反向循环数组,查询小于list[i]的下标位置。然后替换list[j+1]的值。

C# 数据结构--排序[上]的更多相关文章

  1. 深入浅出Redis-redis底层数据结构(上)

    1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...

  2. C# 数据结构--排序[下]

    希尔排序(Shell Sort) 排序思想: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组.所有距离为d1的倍数的记录放在同一个组中.先在各组内进行直接插入排序:然后,取第二个增量d2 ...

  3. JS中的算法与数据结构——排序(Sort)(转)

    排序算法(Sort) 引言 我们平时对计算机中存储的数据执行的两种最常见的操作就是排序和查找,对于计算机的排序和查找的研究,自计算机诞生以来就没有停止过.如今又是大数据,云计算的时代,对数据的排序和查 ...

  4. JS中的算法与数据结构——排序(Sort)

    排序算法(Sort) 引言 我们平时对计算机中存储的数据执行的两种最常见的操作就是排序和查找,对于计算机的排序和查找的研究,自计算机诞生以来就没有停止过.如今又是大数据,云计算的时代,对数据的排序和查 ...

  5. Python 数据结构--排序

      各种排序的时间复杂度和空间复杂度   以下 冒泡排序,选择排序,插入排序,合并排序,快速排序,希尔排序   1 冒泡排序(Bubble Sort) 冒泡排序(Bubble Sort)是一种简单的排 ...

  6. 两篇将rf和boosting方法用在搜索排序上的paper

    在网上看到关于排序学习的早期文章,这两篇文章大致都使用了Random Forest和Boosting方法. 一.paper 1.Web-Search Ranking with Initialized ...

  7. C数据结构排序算法——希尔排序法用法总结(转http://www.cnblogs.com/skywang12345/p/3597597.html)

    希尔排序介绍 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序实质上是一种分组插入方法.它 ...

  8. C数据结构排序算法——直接插入排序法用法总结(转http://blog.csdn.net/lg1259156776/)

    声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 排序相关的的基本概念 排序:将一组杂乱无章的数据按一定的规律顺次排列起来. 数据表( data list): ...

  9. 数据结构排序算法插入排序Java实现

    public class InsertDemo { public static void main(String args[]) { int[] sort ={4,2,1,3,6,5,9,8,10,7 ...

随机推荐

  1. Windows Kernel Way 1:Windows内核调试技术

    掌握Windows内核调试技术是学习与研究Windows内核的基础,调试Windows内核的方式大致分为两种: (1)通过Windbg工具在Windows系统运行之初连接到Windows内核,连接成功 ...

  2. 在Linux下进行磁盘分区

      1.         分区前的规划   2.         查看本机上的磁盘信息   3.         对第二个磁盘进行交换式分区操作(输入m为帮助信息) 图 1:n为新建分区 图 2:p为 ...

  3. if条件判断语句的不同

    let number = ["a":1, "b":2, "c":3]; if let num = number["d"] ...

  4. 【学习笔记】【C语言】变量

    1. 什么是变量 当一个数据的值需要经常改变或者不确定时,就应该用变量来表示.比如游戏积分. 2. 定义变量 1> 目的 任何变量在使用之前,必须先进行定义. 定义变量的目的是:在内存中分配一块 ...

  5. UBUNTU12.4 安装磊科无线网卡驱动

    UBUNTU12.4 安装磊科无线网卡驱动 在淘宝低价买了一个网卡,回来发现不能用 ,擦 无语了. 无赖只能在网上各种找驱动,编译 安装 .今天在终于安装好了WIFI驱动了: 下载地址:https:/ ...

  6. 【转】JavaScript里的this指针

    用自然语言的角度理解JavaScript中的this关键字 <script type="text/javascript"> function ftn03(){ var ...

  7. ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK

    看到本文的标题,相信你会忍不住进来看看! 没错,本文要讲的就是这个重量级的东西,这个不仅仅支持单表查询,更能支持连接查询, 加入一个表10W数据,另一个表也是10万数据,当你用linq建立一个连接查询 ...

  8. protobuf编译报错

    在下载protobuf进行编译的时候会出现如图所示的错误 修改 C:\protobuf-2.4.1\gtest\include\gtest\internal\gtest-tuple.h(C:是我解压p ...

  9. [大牛翻译系列]Hadoop(22)附录D.2 复制连接框架

    附录D.2 复制连接框架 复制连接是map端连接,得名于它的具体实现:连接中最小的数据集将会被复制到所有的map主机节点.复制连接的实现非常直接明了.更具体的内容可以参考Chunk Lam的<H ...

  10. PHP环境搭建(Windows8.1+IIS8.5+PHP5.6+PHPStorm)

    第一次接触php是在2014-5月份左右,当时是自己的主攻方向是C#,对php比较排斥, 其中很多一部分原因,就是PHP的断点调试一直无法配置成功,用echo打印日志的方式排错,使得自己对php心生怨 ...