博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
几种常用排序算法温习
阅读量:6514 次
发布时间:2019-06-24

本文共 3457 字,大约阅读时间需要 11 分钟。

一、 简单排序方法

1.直接插入排序

基本思想:顺序地将待排序的记录按其关键码的大小插入到已排序的记录子序列的适当位置。

算法代码

//直接插入排序        public static void InsertSort(SeqList
seq) { if (seq.IsEmpty() || seq.GetLength() == 1) return; Console.Write("1.1 简单排序 排序前:"); seq.Display(); int tmp; for (int i = 1; i < seq.GetLength(); i++) { if (seq[i] < seq[i - 1]) { tmp = seq[i]; int j; for (j = i - 1; j >= 0 && tmp < seq[j]; j--) { seq[j + 1] = seq[j]; } seq[j + 1] = tmp; } Console.Write("i={0} ", i); seq.Display(); } }
备注:这里的SeqList
是自定义顺序表,这里就不详述了。

直接插入排序时间复杂度与顺序表的有序性有关,基本在o(n)到o(n2)之间。该算法是稳定的。若排序记录的数目 n 较小(如 n≤50)时,可采用直接插入排序或简

单选择排序。

2.冒泡排序

基本思想:将相邻的记录的关键码进行比较,如果前面记录的关键码大于后面记录的关键码,则将它们交换,否则不交换。

算法代码

//冒泡排序        public static void BubbleSort(SeqList
seq) { if (seq.IsEmpty() || seq.GetLength() == 1) return; Console.Write("1.2 冒泡排序 排序前:"); seq.Display(); int tmp; for (int i = 0; i < seq.Last;i++) { for (int j = seq.Last-1; j >= i; j--) { if (seq[j + 1]

时间复杂度:最好O(n),最坏O(n^2)。它是稳定的。

3.简单排序算法

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

算法代码

//简单选择排序        public static void SimpleSelectSort(SeqList
seq) { if (seq.IsEmpty() || seq.GetLength() == 1) return; Console.Write("1.3 简单选择排序 排序前:"); seq.Display(); int tmp; int index; for (int i = 0; i < seq.Last; i++) { index = i; for (int j = i; j <= seq.Last; j++) { if (seq[j] < seq[index]) { index = j;//找到最小元素下标 } } tmp = seq[i];//交换 seq[i] = seq[index]; seq[index] = tmp; Console.Write("i={0} ", i); seq.Display(); } }

时间复杂度:O(n^2),它是稳定的排序。若记录的初始状态已经按关键码基本有序,可采用直接插入排序或冒泡排序。

二、快速排序

基本思想:通过不断比较关键码,以某个记录为界(该记录称为支点) ,将待排序列分成两部分。其中,一部分满足所有记录的关键码都大于或等于支点记录的关键码,另一部分记录的关键码都小于支点记录的关键码。把以支点记录为界将待排序列按关键码分成两部分的过程,称为一次划分。对各部分不断划分,直到整个序列按关键码有序为止。

算法代码

//快速排序,递归,以第一个元素为支点       public static void QuickSort(SeqList
seqlist, int low, int high) { int tmplow = low;//临时保存开头元素索引 int tmphigh = high;//临时保存结束元素索引 int tmp = seqlist[low]; if (low >= high) return; while (low < high) { while (low < high && seqlist[high] >= tmp) high--; seqlist[low] = seqlist[high]; while (low < high && seqlist[low] <= tmp) low++; seqlist[high] = seqlist[low]; } seqlist[low] = tmp; seqlist.Display(); QuickSort(seqlist, tmplow, low - 1); QuickSort(seqlist, low + 1, tmphigh); }

时间复杂度:快速排序方法的平均性能最好,时间复杂度为O(nlog2n),当待排序序列已经按关键码随机分布时,快速排序是最适合的。但快速排序在最坏情况下时间复杂度是O(n2)。快速排序方法是不稳定的排序方法。

    本文转自 陈敬(Cathy) 博客园博客,原文链接:http://www.cnblogs.com/janes/archive/2011/11/01/2231567.html,如需转载请自行联系原作者

你可能感兴趣的文章
Java数据结构与算法(六) 希尔排序
查看>>
canvas学习笔记
查看>>
elasticsearch安装步骤
查看>>
PHP获取Cookie模拟登录CURL(转)
查看>>
PHP-权限控制类(转)
查看>>
CSS3秘笈第三版涵盖HTML5学习笔记9~12章
查看>>
bzoj1044木棍分割
查看>>
leetcode-136-Single Number
查看>>
http服务器小项目
查看>>
一些数学上的名词及操作
查看>>
<%@ include %>指令和<jsp:include>区别
查看>>
因为文件组 'PRIMARY' 已满 解决办法
查看>>
Flume 读取实时更新的日志文件
查看>>
HDU 2049
查看>>
《Spring1之第十次站立会议》
查看>>
Unity Shader 噪声消融特效 - 剑灵死亡特效
查看>>
Eclipse 自动生成 Ant的Build.xml 配置文件
查看>>
添加一条信息到列表,如果重复就替换,
查看>>
C#基础第五天
查看>>
python 小数相加报错 invalid literal for int() with base 10
查看>>