C# 冒泡排序法、插入排序法、选择排序法
冒泡排序法
是数组等线性排列的数字从大到小或从小到大排序。
以从小到大排序为例。
数据 11, 35, 39, 30, 7, 36, 22, 13, 1, 38, 26, 18, 12, 5, 45, 32, 6, 21, 42, 23
使用 数组 int [] array 存储数字。
过程 (数组从小到大排序)
思路循环都把最大的数放在最后一位,无序数字个数减1。
i 为当前任务位置,n 剩下的无序数字个数
从第 0位开始,比较前后两位数字大大小,当 array[i] > array[i+1] 时,数值互换。
一个循环后,数值最大的已经存到数组最后一位。
无序数字个数 n-1
for (int j = array.Length - ; j > ; j--) //每排一次,剩下的无序数减一
{
for (int i = ; i < j; i++) //一个for循环获得一个最大的数
{
if (array[i] > array[i + ]) //数值互换
{
var sap = array[i];
array[i] = array[i + ];
array[i + ] = sap;
}
}
}
排序结果
动图如下
插入排序法
插入排序算法是把一个数插入一个已经排序好的数组中。
例如 把 22 插入到 [1,5,10,17,28,39,42] 中,
结果 [1,5,10,17,22,28,39,42] 。
对数组使用插入排序法
数组 int [] array = [11, 39, 35, 30, 7, 36, 22, 13, 1, 38, 26, 18, 12, 5, 45, 32, 6, 21, 42, 23];
数组元素是无序,设定一个从大到小或从小到大的方向,第一位就是有序的 [ 11 ] ,
第一次插入: [, 39, 35, 30, 7, 36, 22, 13, 1, 38, 26, 18, 12, 5, 45, 32, 6, 21, 42, 23]。
取第二个数跟第一个进行比较, 两位有序 [11, 39]
第二次插入:[11, , 35, 30, 7, 36, 22, 13, 1, 38, 26, 18, 12, 5, 45, 32, 6, 21, 42, 23]
取第三个数,[11, 39, 35],进行插入
[11, 35, 39 ,30, 7, 36, 22, 13, 1, 38, 26, 18, 12, 5, 45, 32, 6, 21, 42, 23]
... ...
以后每次取一个数,插入数组。
实现方法有很多种,笔者的方法跟冒泡排序法相似。
public static void ReSort(ref int[] array)
{
for (int i = ; i < array.Length; i++) //要将第几位数进行插入
{
for (int j = i; j > ; j--)
{
if (array[j] > array[j - ]) break; //如果要排序的数大于已排序元素的最大值,就不用比较了。不然就要不断比较找到合适的位置
else
{
int sap = array[j];
array[j] = array[j - ];
array[j - ] = sap;
}
}
}
}
试试把下面的代码复制到控制台,可以看到每次排序的结果。
using System; namespace ConsoleApp1
{ class Program
{
public static void ReSort(ref int[] array)
{
for (int i = ; i < array.Length; i++)
{
Console.WriteLine("\n- - - - - - -");
Console.WriteLine("\n未排序前:");
for (int sun = ; sun <= i && sun < array.Length; sun++)
{
Console.Write($"{array[sun]} , ");
} for (int j = i; j > ; j--)
{
if (array[j] > array[j - ]) break;
else
{
int sap = array[j];
array[j] = array[j - ];
array[j - ] = sap;
}
}
Console.WriteLine("\n排序后: ");
for (int sun = ; sun <= i && sun < array.Length; sun++)
{
Console.Write($"{array[sun]} , ");
}
}
}
static void Main(string[] args)
{
int[] array = new int[] { , , , , , , , , , , , , , , , , , , , };
Console.Write("原数组:[");
foreach (var i in array)
{
Console.Write($"{i} , ");
}
Console.Write("]\n"); ReSort(ref array);
Console.Write("\n- - - - -\n最后结果:[");
foreach (var i in array)
{
Console.Write($"{i} , ");
}
Console.Write("]\n");
Console.ReadKey();
}
}
}
动图演示
冒泡排序法与插入排序法比较
冒泡排序是从一端开始,比较大小后存到另一端。每次都是从前开始,把最大或最小的结果放到最后。
插入排序始终是从前面开始,把下一个元素存到前面,不用比较最大最小的结果。
选择排序法
每次从后面找到最小或最大的数,进行位移排序。
数组 int [] array = [11, 39, 35, 30, 7, 36, 22, 13, 1, 38, 26, 18, 12, 5, 45, 32, 6, 21, 42, 23];
第一位 i=0
最小值下标 minIndex = 0,最小值 min=11
从后面查找比 11 小的数,找到第 下标位 8,值为1,
进行交换,交换后 [1, 39, 35, 30, 7, 36, 22, 13, 11, 38, 26, 18, 12, 5, 45, 32, 6, 21, 42, 23];
第二位 i=1,
最小值下标 minIndex = 1,最小值 min=39,
从后面查找比 39 小且最小的数,找到 下标为 13,值为 5,
进行交换,交换后 [1, 5, 35, 30, 7, 36, 22, 13, 11, 38, 26, 18, 12, 39, 45, 32, 6, 21, 42, 23];
public static void ReSort(ref int[] array)
{
for (int i = ; i < array.Length; i++)
{
int min = array[i]; //设定第i位为最小值
int minIndex = i; //最小值下标
for (int j = i; j < array.Length; j++) //从第i为开始找出最小的数
{
if (array[j] < array[minIndex]) //重新存储最小值和下标
{
min = array[j];
minIndex = j;
}
} if (array[i] != array[minIndex]) //如果到比第i为更小的数,则发生交换。找不到则不改变
{
array[minIndex] = array[i];
array[i] = min;
}
}
}
动图如下
C# 冒泡排序法、插入排序法、选择排序法的更多相关文章
- Javascript中的冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序 算法性能分析
阿里面试中有一道题是这样的: 请用JavaScript语言实现 sort 排序函数,要求:sort([5, 100, 6, 3, -12]) // 返回 [-12, 3, 5, 6, 100],如果你 ...
- 三、排序算法总结一(冒泡排序,插入排序,选择排序)(C++版本)
一.引言 对于各种排序算法也算是有了一定的了解,所以这里做一个总结. 二.冒泡排序法. 这是比较经典的排序算法,主要是通过内外两层的循环比较,使得乱序变为顺序. 下面是一个测试代码 #include ...
- 三种排序算法python源码——冒泡排序、插入排序、选择排序
最近在学习python,用python实现几个简单的排序算法,一方面巩固一下数据结构的知识,另一方面加深一下python的简单语法. 冒泡排序算法的思路是对任意两个相邻的数据进行比较,每次将最小和最大 ...
- JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序
1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...
- c/c++ 算法之快速排序法 冒泡排序法,选择排序法,插入排序法
本文详细叙述和实现了快速排序算法,冒泡排序 选择排序 插入排序比较简单,原理在这里不再详述,直接用代码进行了实现. 快速排序法(quicksort)是目前所公认最快的排序方法之一(视解题的对象而定), ...
- Java 快速排序法 冒泡排序法 选择排序法 插入排序法
1.快速排序的原理: 选择一个关键值作为基准值.比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的). 从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果 ...
- 选择排序法、冒泡排序法、插入排序法、系统提供的底层sort方法排序之毫秒级比较
我的代码: package PlaneGame;/** * 选择排序法.冒泡排序法.插入排序法.系统提供的底层sort方法排序之毫秒级比较 * @author Administrator */impo ...
- c语言:简单排序:冒泡排序法、选择排序法、插入排序法(待写)
1.冒泡排序法: 假设有n个数需要按从小到大排序,冒泡排序的原理是,在这一排数字中,将第一个数与第二个数比较大小,如果后面的比前面的小,就将他们交换位置.然后再比较第二个和第三个,再交换,直到第n-1 ...
- php排序介绍_冒泡排序_选择排序法_插入排序法_快速排序法
这里我们介绍一些常用的排序方法,排序是一个程序员的基本功,所谓排序就是对一组数据,按照某个顺序排列的过程. 充效率看 冒泡排序法<选择排序法<插入排序法 排序分两大类: 内部排序法 交换式 ...
随机推荐
- R语言格式化数字和字符串format函数
数字和字符串可以使用 format()函数的格式化为特定样式. 语法 format()函数的基本语法是: format(x, digits, nsmall,scientific,width,justi ...
- TLD(Tracking-Learning-Detection)一种目标跟踪算法
原文:http://blog.csdn.net/mysniper11/article/details/8726649 视频介绍网址:http://www.cvchina.info/2011/04/05 ...
- Java异步转同步
参考原文: <http://blog.csdn.net/veson__/article/details/53898890>
- hdu 1054 Strategic Game 经典树形DP
Strategic Game Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- K:单例模式中存在的问题
对于单例模式的实现,无论其是否具有懒加载的功能,我们的目标是有且仅生成一个对象.但是,实际上,对于单例模式的一般实现,都会存在着以下的两个问题: 序列化攻击: 对于枚举方式实现的单例模式,并不存在 ...
- equals、==和hashCode
equals和== ==可以用于基本类型和引用类型:当用于基本类型时,比较值是否相同:当用于引用类型时,比较的是所指向的对象的地址是否相同.如果有包装类型,则先将包装类型转换为基本类型再比较值是否相等 ...
- UVA1185 Big Number
题目大意:求十进制下x!的位数 这题其实就是要求\(\lg\)函数值的前缀和啊 对于一个数x,若\(\lg x=y\),则其位数为\(\lfloor y+1 \rfloor\) 然后对于对数,我们有\ ...
- UOJ#54 BZOJ3434 [WC2014]时空穿梭
题目描述 小 X 驾驶着他的飞船准备穿梭过一个 \(n\) 维空间,这个空间里每个点的坐标可以用 \(n\) 个实数表示,即 \((x_1,x_2,\dots,x_n)\). 为了穿过这个空间,小 X ...
- drupal的权限设置
通过hook_menu()设置url的权限,有两种方式: 方式一:定义函数,通过 access callback 'access callback' => 'fun()', function f ...
- 解析json结构绘制canvas
在工作中偶尔会遇到绘制转发卡/邀请卡的业务,且这个转发卡/邀请卡的风格会有很多,要求最后生成图片.这时候如果使用一张图片绘制一个canvas,这个工作量会相当大.分析一下转发邀请的内容,会发现所有的里 ...