最近忙着找工作,虽然排序算法用得到的情况不多,但不熟悉的话心里始终还是感觉没底。

于是今天给温习了其中的四个排序算法(与其说是温习,不如说是学习、、、因为感觉自己好像从来木有掌握过它们、、、)

一、选择排序

简单粗暴:将无序区变为有序区,每次将无序区中最小的挑选到最前面形成有序区。

例子:

5 3 7 8 4 原始数组

3 5 7 8 4 将3与5交换,因为后面的数字都比3大,所以不会再产生交换

3 4 7 8 5 同上,将 4与5交换

3 4 5 8 7 将5与7交换

3 4 5 7 8 将7与8交换

3 4 5 7 8

代码:

        /// <summary>
/// 选择排序
/// </summary>
/// <param name="nList"></param>
public static void SelectSort(int[] nList)
{
for (int i = ; i < nList.Length; i++)
{
for (int j = i; j < nList.Length; j++)
{
if (nList[j] < nList[i])
{
int nTemp = nList[i];
nList[i] = nList[j];
nList[j] = nTemp;
}
}
}
}

二、冒泡排序

生动形象:每一轮都将无序区中最大的数字弄到最后面,像冒泡一样

5 3 7 8 4 原始数组

3 5 7 8 4 比较5与3,发现5比3大,交换之

3 5 7 8 4 比较5与7,不变

3 5 7 8 4 比较7与8,不变

3 5 7 4 8 将4与8交换

3 5 7 4   剩下的无序区,重复以上步骤即可

代码:

        /// <summary>
/// 冒泡排序
/// </summary>
/// <param name="nList"></param>
public static void BubbleSort(int[] nList)
{
for (int i = nList.Length - ; i > ; i--)
{
for (int j = ; j < i; j++)
{
if (nList[j] > nList[j + ])
{
int nTemp = nList[j];
nList[j] = nList[j + ];
nList[j + ] = nTemp;
}
}
}
}

三、插入排序

望文生义:将元素插入到已经排序好的区域

3 5 7 8 4 原始数组

3 5 7 8 4 从5开始插入,直接放在末尾

3 5 7 8 4 将7放到末尾

3 5 7 8 4 将8放到末尾

3 4 5 7 8 将8、7、5后移,将4插入

代码:

        /// <summary>
/// 插入排序
/// </summary>
/// <param name="nList"></param>
public static void InserSort(int[] nList)
{
int nTemp;
for (int i = ; i < nList.Length; i++)
{
nTemp = nList[i];//记住待插入元素
for (int j = i - ; j >= ; j--)
{
//若待插元素比当前元素小,则将当前元素往后移
if (nList[j] > nTemp)
{
nList[j + ] = nList[j]; if (j == )
{
nList[] = nTemp;
}
}
//反之,待插元素大于等于当前元素,则将待插元素放到当前元素的后面即可,并终止本轮循环
else
{
nList[j + ] = nTemp;
break;
}
}
}
}

四、快速排序

快成一道闪电:改良的冒泡排序(但相对前面三种方法,掌握起来就要慢一些了。。。)

3 5 7 8 4 哨兵:3 nLeft :5 nRight:4

、、、发现用这个来作为例子显然不合适嘛、、、来个加长版的,OK?

72 6 57 88 60 42 83 73 48 85 哨兵:72

x   i                                   j

取出72(此时nList为空),从j开始向左找到第一个比72小的数字:48,将其放到nList[0]中。

48 6 57 88 60 42 83 73 空 85

再从i开始向右找到第一个比72大的数,放到“空”的位置(注意,当i == j时此轮排序结束,所以要加判定)

48 6 57 空 60 42 83 73 88 85

重复以上步骤

48 6 57 42 60 空 83 73 88 85  此时 J 和 I会在“空”处相等,将前面的72填入“空”

48 6 57 42 60 72 83 73 88 85

后面用分治法继续快速排序[48,6,57,42,60]与[83,73,88,85]即可

代码:

        /// <summary>
/// 快速排序
/// </summary>
public static void QuickSort(int[] nList,int nLow,int nHigh)
{
//终止条件
if (nLow >= nHigh)
{
return;
}
//当nLeft 等于 nRight之时,结束此轮快速排序
int nLeft = nLow;
int nRight = nHigh; int nTemp = nList[nLow]; while(nLeft < nRight)
{
while(nLeft < nRight && nList[nRight] >= nTemp)
{
nRight--;
}
if (nLeft < nRight)
{
nList[nLeft++] = nList[nRight];
}
while (nLeft < nRight && nList[nLeft] <= nTemp)
{
nLeft++;
}
if (nLeft < nRight)
{
nList[nRight--] = nList[nLeft];
}
} nList[nLeft] = nTemp; QuickSort(nList, nLow, nLeft - );
QuickSort(nList, nLeft + , nHigh); }

温(Xue)习排序算法的更多相关文章

  1. 常用排序算法总结(C语言描述)

    最近又把排序给复(yu)习(xi)了一遍,在此总结一下~具体理论思想持续补充完善中... 1.交换排序 (1)普通冒泡 时间复杂度:最差.平均都是O(n^2),最好是O(n) 空间复杂度:O(1) # ...

  2. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  3. 排序算法----基数排序(RadixSort(L))单链表智能版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  4. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  5. 几大排序算法的Java实现

    很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...

  6. 排序算法----基数排序(RadixSort(L,max))单链表版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  7. 排序算法汇总(C/C++实现)

    前言:     本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...

  8. 用Java来写常见的排序算法

    随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * ...

  9. 模板化的七种排序算法,适用于T* vector<T>以及list<T>

    最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...

随机推荐

  1. java中可以让程序暂停几秒执行的代码

    //n为毫秒数 try { Thread.sleep ( n ) ; } catch (InterruptedException ie){} try { TimeUnit.SECONDS.sleep( ...

  2. React Diff 算法

    React介绍 React是Facebook开发的一款JS库,用于构建用户界面的类库. 它采用声明式范例,可以传递声明代码,最大限度地减少与DOM的交互. 特点: 声明式设计:React采用声明范式, ...

  3. 谷歌浏览器怎么调试js 谷歌浏览器调试javascript教程

    谷歌浏览器是一款由谷歌公司开发的浏览器.谷歌浏览器是一款基于其他开源软件所撰写的.下面小编为大家分享一篇谷歌浏览器调试javascript的教程,希望帮助大家 首先我们打开开发者工具,你可以直接在页面 ...

  4. 1029:Ignatius and the Princess IV

    题目大意是找出数组中出现次数超过一半的数. 基本思想:每遇到两个不同的数就消掉,设一个计数器就行了.   存出现次数最大的那个数的出现次数. 当下一个数与当前的数不同时,计数器减一,相同,则加一. 实 ...

  5. R学习笔记 ---- 系列文章

    R实战 开篇:介绍R的使用 R学习笔记 第五篇:字符串操作 R学习笔记 第六篇:数据变换和清理 R学习笔记 第四篇:函数,分支和循环 R学习笔记 第三篇:数据框 R学习笔记 第二篇:矩阵.数组和列表 ...

  6. TimeExit 界面无点击定时退出类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  7. sql server利用cte递归查询

    1.数据环境准备 参考Oracle递归查询文章. 2.查询某个节点下的所有子节点 with cte(id,name,parent_id) as ( select id,name,parent_id f ...

  8. VC++常规错误之17:1>nafxcwd.lib(afxmem.obj) : error LNK2005

    VC++常规错误之17:1>nafxcwd.lib(afxmem.obj) : error LNK2005 (1)错误案例:在写日志程序中出现,工程是MFC程序(注:win32控制台应用程序,不 ...

  9. request 里面参数设置 (有空瞄下)

    Requests 是用python语言编写的第三方库,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,完全满足 HTTP 测试需求, ...

  10. cas服务器搭建

    一.CAS是Central Authentication Service的缩写,中央认证服务,一种独立开放指令协议.CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的 ...