C# 数据结构--排序[上]
概述
看了几天的排序内容,现在和大家分享一些常见的排序方法。
啥是排序?
个人理解的排序:通过对数组中的值进行对比,交换位置最终得到一个有序的数组。排序分为内存排序和外部排序。本次分享排序方法都为内存排序。
啥是排序的稳定性?
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,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# 数据结构--排序[上]的更多相关文章
- 深入浅出Redis-redis底层数据结构(上)
1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...
- C# 数据结构--排序[下]
希尔排序(Shell Sort) 排序思想: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组.所有距离为d1的倍数的记录放在同一个组中.先在各组内进行直接插入排序:然后,取第二个增量d2 ...
- JS中的算法与数据结构——排序(Sort)(转)
排序算法(Sort) 引言 我们平时对计算机中存储的数据执行的两种最常见的操作就是排序和查找,对于计算机的排序和查找的研究,自计算机诞生以来就没有停止过.如今又是大数据,云计算的时代,对数据的排序和查 ...
- JS中的算法与数据结构——排序(Sort)
排序算法(Sort) 引言 我们平时对计算机中存储的数据执行的两种最常见的操作就是排序和查找,对于计算机的排序和查找的研究,自计算机诞生以来就没有停止过.如今又是大数据,云计算的时代,对数据的排序和查 ...
- Python 数据结构--排序
各种排序的时间复杂度和空间复杂度 以下 冒泡排序,选择排序,插入排序,合并排序,快速排序,希尔排序 1 冒泡排序(Bubble Sort) 冒泡排序(Bubble Sort)是一种简单的排 ...
- 两篇将rf和boosting方法用在搜索排序上的paper
在网上看到关于排序学习的早期文章,这两篇文章大致都使用了Random Forest和Boosting方法. 一.paper 1.Web-Search Ranking with Initialized ...
- C数据结构排序算法——希尔排序法用法总结(转http://www.cnblogs.com/skywang12345/p/3597597.html)
希尔排序介绍 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序实质上是一种分组插入方法.它 ...
- C数据结构排序算法——直接插入排序法用法总结(转http://blog.csdn.net/lg1259156776/)
声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 排序相关的的基本概念 排序:将一组杂乱无章的数据按一定的规律顺次排列起来. 数据表( data list): ...
- 数据结构排序算法插入排序Java实现
public class InsertDemo { public static void main(String args[]) { int[] sort ={4,2,1,3,6,5,9,8,10,7 ...
随机推荐
- Mysql中查找并删除重复数据的方法
(一)单个字段 1.查找表中多余的重复记录,根据(question_title)字段来判断 代码如下 复制代码 select * from questions where question_title ...
- ASP.NET 跨域获取JSON天气数据
前几天做一个门户网站,在首页需要加载气象数据,采用了中央气象局的接口. 刚开始采用JSONP在前台跨域请求数据,没成功~ 后换成在c#后台请求数据返回... 前端代码: $(function () { ...
- ACCESS的System.Data.OleDb.OleDbException: INSERT INTO 语句的语法错误
一直用的是SQL 数据库,突然改用Access了,使用起来就是没有SQL 顺畅,老是出来些意想不到的错误.今天用Access做的网站程序进行添加数据,调试了一下午,总是异常…… 提示ACCESS的Sy ...
- hdu 1716(dfs)
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1716 排列2 Problem Description Ray又对数字的列产生了兴趣:现 ...
- UI1_UIView层操作
// // ViewController.m // UI1_UIView层操作 // // Created by zhangxueming on 15/7/1. // Copyright (c) 20 ...
- 关于js unshift() 与pop() 功能
最近在研究如何精简贪吃蛇代码,网上许多大神已经将其精简到30行之内就可以搞定. 我尝试着学习并且研究是否能进一步精简的方式. 偶然间又重新温习了一遍pop()和unshift() 的功能.(之前有学过 ...
- Java线程面试题 Top 50(转载)
原文链接:http://www.importnew.com/12773.html 本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎加入Java小组.转载请参见文章末尾的 ...
- Toad for Oracle 快捷键
F4 看表的结构 F5 执行对话框中的SQL,注意最后需要以;结尾 F7 清除当前编辑框中所有的sql F8 查看历史的sql语句 F9 执行当前行的sql F10 看菜单 Ctrl + F12 保存 ...
- 玄机宝盒v1.6.1.1
最新版本:玄机宝盒v1.6.1.1 玄机宝盒v1.6.1.1 04-14/2016 给你的将是无与伦比的体验http://bbs.msdn5.com/thread-15-1-1.html(出处: 玄机 ...
- xml操作
一.LINQ to XML 编程基础 1.LINQ to XML类 System.Xml.Linq命名空间含有19个类,下表列出了它们的名称及其描述: 类 描述 XAttribute 表示一个 XML ...