算法:冒泡排序(Bubble Sort)、插入排序(Insertion Sort)和选择排序(Selection Sort)总结
背景
这两天温习了 5 中排序算法,之前也都看过它们的实现,因为没有深入分析的缘故,一直记不住谁是谁,本文就记录一下我学习的一些心得。
三种排序算法可以总结为如下:
- 都将数组分为已排序部分和未排序部分。
- 冒泡排序将已排序部分定义在右端,在遍历未排序部分的过程执行交换,将最大元素交换到最右端。
- 插入排序将已排序部分定义在左端,将未排序部分元的第一个元素插入到已排序部分合适的位置。
- 选择排序将已排序部分定义在左端,然后选择未排序部分的最小元素和未排序部分的第一个元素交换。
冒泡排序
代码
public static void Sort(T[] items)
{
if (items.Length < )
{
return;
} int swappedTimes;
do
{
swappedTimes = ;
// 重复的遍历数组。
for (var i = ; i < items.Length; i++)
{
// 每次遍历都比较两个元素,如果顺序不正确就把他们交换一下。
if (items[i - ].CompareTo(items[i]) > )
{
Swap(items, i - , i);
swappedTimes++;
}
}
} while (swappedTimes > );// 如果遍历后只交换了 1 次或 0 次,排序结束。
}
示例
【4,3,2,1】
【3,4,2,1】
【3,2,4,1】
【3,2,1,4】
【2,3,1,4】
【2,1,3,4】
【1,2,3,4】
插入排序
代码
public static void Sort(T[] items)
{
for (
var sortedRangeEndIndex = ;
sortedRangeEndIndex < items.Length;
sortedRangeEndIndex++)
{
if (items[sortedRangeEndIndex].CompareTo(items[sortedRangeEndIndex - ]) < )
{
int insertIndex = FindInsertionIndex(items, items[sortedRangeEndIndex]);
Insert(items, sortedRangeEndIndex, insertIndex);
}
}
} private static int FindInsertionIndex(T[] items, T valueToInsert)
{
for (var i = ; i < items.Length; i++)
{
if (items[i].CompareTo(valueToInsert) > )
{
return i;
}
} throw new InvalidOperationException();
} private static void Insert(T[] items, int indexInsertingFrom, int indexInsertingAt)
{
var temp = items[indexInsertingFrom]; for (var i = indexInsertingFrom; i > indexInsertingAt; i--)
{
items[i] = items[i - ];
} items[indexInsertingAt] = temp;
}
示例
【4,3,2,1】
【3,4,2,1】
【2,3,4,1】
【1,2,3,4】
选择排序
代码
public static void Sort(T[] items)
{
for (
var sortedRangeEndIndex = ;
sortedRangeEndIndex < items.Length;
sortedRangeEndIndex++)
{
int nextIndex = FindIndexOfSmallestFromIndex(items, sortedRangeEndIndex);
Swap(items, sortedRangeEndIndex, nextIndex);
}
} private static int FindIndexOfSmallestFromIndex(T[] items, int sortedRangeEndIndex)
{
T currentSmallItem = items[sortedRangeEndIndex];
int currentSmllIndex = sortedRangeEndIndex; for (var i = sortedRangeEndIndex + ; i < items.Length; i++)
{
if (currentSmallItem.CompareTo(items[i]) > )
{
currentSmallItem = items[i];
currentSmllIndex = i;
}
} return currentSmllIndex;
}
示例
【4,3,2,1】
【1,3,2,4】
【1,2,3,4】
【1,2,3,4】
备注
每周坚持学习数据结构和算法中。。。
算法:冒泡排序(Bubble Sort)、插入排序(Insertion Sort)和选择排序(Selection Sort)总结的更多相关文章
- 跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)
跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort) 选择排序(selection sort) 算法原理:有一筐苹果,先挑出最大的一个放在最后,然后 ...
- 排序算法 - 选择排序(selection sort)
选择排序(Selection sort)跟插入排序一样,也是O(n^2)的复杂度,这个排序方式也可以用我们的扑克牌来解释. 概念 桌面上有一堆牌,也是杂乱无章的,现在我们想将牌由小到大排序,如果使用选 ...
- 排序算法--选择排序(Selection Sort)_C#程序实现
排序算法--选择排序(Selection Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来 ...
- 选择排序 Selection Sort
选择排序 Selection Sort 1)在数组中找最小的数与第一个位置上的数交换: 2)找第二小的数与第二个位置上的数交换: 3)以此类推 template<typename T> / ...
- 简单选择排序 Selection Sort 和树形选择排序 Tree Selection Sort
选择排序 Selection Sort 选择排序的基本思想是:每一趟在剩余未排序的若干记录中选取关键字最小的(也可以是最大的,本文中均考虑排升序)记录作为有序序列中下一个记录. 如第i趟选择排序就是在 ...
- [算法] 选择排序 Selection sort
选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然 ...
- 【排序算法】选择排序(Selection sort)
0. 说明 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最 ...
- 排序--选择排序Selection Sort Java实现
基本原理 选择排序的简单原理:选择排序算法通过从未排序部分重复查找最小元素(考虑升序)并将其放在开头来对数组进行排序. 将数组两个子数组: 已排序子数组 未排序子数组 选择排序中每次循环都会从未排序子 ...
- 基础算法之选择排序Selection Sort
原理 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕.一种简单直观的排序算 ...
- 选择排序——Selection Sort
基本思想: 在长度为N的无序数组中,第一次遍历n-1个数,找到最小的数值与第一个元素交换:第二次遍历n-2个数,找到最小的数值与第二个元素交换:...第n-1次遍历,找到最小的数值与第n-1个元素交换 ...
随机推荐
- CVE-2010-2883Adobe Reader和Acrobat CoolType.dll栈缓冲区溢出漏洞分析
Adobe Acrobat和Reader都是美国Adobe公司开发的非常流行的PDF文件阅读器. 基于Window和Mac OS X的Adobe Reader和Acrobat 9.4之前的9.x ...
- Hive(六)内置函数与高级操作
一内置函数 1 数学函数 Return Type Name (Signature) Description DOUBLE round(DOUBLE a) Returns the rounded BIG ...
- awk调用shell命令的两种方法:system与print
from:http://www.oklinux.cn/html/developer/shell/20070626/31550.htmlawk中使用的shell命令,有2种方法: 一.使用所以syste ...
- git clone push需要root权限解决方法
重新装了Linux发现使用git命令必须要sudo,否则会提示权限不够. 解决办法:在ssh生成id_rsa.pub密钥时实际上有两个,根目录的家里.ssh文件夹里有一个,用户家里.sh文件夹里有一个 ...
- Linux 下开发环境的搭建(软件安装)
一.Centos6.5下安装JDK 步骤1: 查看现有安装的JDK版本 rpm –qa | grep -i java 步骤2: 卸载已有软件 rpm -e --nodeps java-1.7.0-op ...
- TP5:使用了INPUT函数来接收参数了,还需再过滤SQL注入吗
TP5:使用了INPUT函数来接收参数了,还需再过滤SQL注入吗,默认的INPUT函数都做了哪些动作啊 有了PDO参数绑定 基本上不需要考虑sql注入的问题(除非自己拼接SQL),需要考虑的是XSS方 ...
- MySQL大事务导致的Insert慢的案例分析
[问题] 有台MySQL服务器不定时的会出现并发线程的告警,从记录信息来看,有大量insert的慢查询,执行几十秒,等待flushing log,状态query end [初步分析] 从等待资源来看, ...
- ceph journal操作
查询ceph journal的地方 ceph --admin-daemon /var/run/ceph/ceph-osd.0.asok config show | grep osd_journal & ...
- PHP的钩子实现解析
钩子是编程里一个常见的概念,非常的重要.它使得系统变得非常容易拓展(而不用理解其内部的实现机理,这样可以减少很多工作量).只要有一个钩子样本,能很容易仿照第一个钩子快速的编写第二个钩子,这里对钩子进行 ...
- Struts2的概念
Struts2的概念 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数 ...