C#排序1(冒泡排序、直接排序、快速排序)
冒泡排序:就是两个两个的这个比较好理解,代码也比较好写出来。
它的原理就是相邻的两个两个的比较,如果前面的数比后面的大,那么交换,它这个在比较完一次的时候可以得到最大的一个数,然后接着循环,每次外循环中内循环的次数比原来少一次。
#region 冒泡排序
2 /// <summary>
3 /// 冒泡排序
4 /// </summary>
5 /// <param name="list"></param>
6 /// <returns></returns>
7 public List<int> BubbleSort(List<int> list)
8 {
9 for (int i = 0; i < list.Count - 1; i++)
10 {
11 for (int j = 0; j < list.Count - 1 - i; j++)
12 {
13 if (list[j] > list[j + 1])
14 {
15 int temp = list[j];
16 list[j] = list[j + 1];
17 list[j + 1] = temp;
18 }
19 }
20 }
21 return list;
22 }
23 #endregion
直接排序原理是,让第一个元素和之后的每一个元素相互比较,如果大就交换,每次可以让第一个元素为最小值,如图:
#region 直接排序
/// <summary>
/// 直接排序
/// </summary>
/// <param name="list"></param>
public void SelectionSort(List<int> list)
{
for (int i = 0; i < list.Count; i++)
{
for (int j = i + 1; j < list.Count; j++)
{
if (list[i] > list[j])
{
int temp = list[i];
list[i] = list[j];
list[j] = temp;
}
}
}
}
#endregion
快速排序:貌似效率是最高的,在C#中的类库排序就是用的它:
它的原理是:有两个指针left和right left默认先指向 最左边的元素 right默认指向最右边的元素,然后把指针为left的元素定义为标准,实现在标准左边的元素比标准小,右边的元素比标准大,然后经过递归不断的建立标准 ,而实现排序
下面是我的一些理解:
比如要排序的数组是 643581这些数,黄色代表Left指针;红色代表right指针;蓝色表示left和right重合
开始:left指向第一个元素,right指向最后一个元素
第1次:left指针和left+1比较,6>4,left指针向右移动,right不变;left的值和left+1的值互换
第2次:left指针和left+1比较,6>3,left指针向右移动,right不变;left的值和left+1的值互换
第3次:left指针和left+1比较,6>5,left指针向右移动,right不变;left的值和left+1的值互换
第4次:left指针和left+1比较,6<8,left指针不动,right向左移动;right的值和left+1的值互换
第5次:left指针和left+1比较,6>1,left指针向右移动,right不变;left的值和left+1的值互换;
发现left和right重合 ,实现6左边的比6小,6右边的比6大。然后重新定义
left=原来的left;right=left-1
left=left+1 与right=原来的right 接着进行下次遍历
下面是C#代码:
#region 快速排序
/// <summary>
/// 快速排序
/// </summary>
/// <param name="list"></param>
/// <param name="left"></param>
/// <param name="right"></param>
public void QuickSort(List<int> list, int left, int right)
{
if (left < right)
{
int i = Division(list, left, right);
QuickSort(list, i + 1, right);
QuickSort(list, left, i - 1);
}
} /// <summary>
///把列表按照list[left]分到左右两边
/// </summary>
/// <param name="list"></param>
/// <param name="left"></param>
/// <param name="right"></param>
/// <returns></returns>
private int Division(List<int> list, int left, int right)
{
while (left < right)
{
int num = list[left];
if (num > list[left + 1])
{
list[left] = list[left + 1];
list[left + 1] = num;
left++;
}
else
{
int temp = list[right];
list[right] = list[left + 1];
list[left + 1] = temp;
right--;
}
Console.WriteLine(string.Join(",", list));
}
Console.WriteLine("--------------\n");
return left;
}
#endregion
C#排序1(冒泡排序、直接排序、快速排序)的更多相关文章
- 归并排序 & 计数排序 & 基数排序 & 冒泡排序 & 选择排序 ----> 内部排序性能比较
2.3 归并排序 接口定义: int merge(void* data, int esize, int lpos, int dpos, int rpos, int (*compare)(const v ...
- php基础排序算法 冒泡排序 选择排序 插入排序 归并排序 快速排序
<?php$arr=array(12,25,56,1,75,13,58,99,22);//冒泡排序function sortnum($arr){ $num=count($arr); ...
- [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序
用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html 目录 马桶排序(令人 ...
- 数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现
这五种排序算法难度依次增加. 冒泡排序: 第一次将数组相邻两个元素依次比较,然后将大的元素往后移,像冒泡一样,最终最大的元素被移到数组的最末尾. 第二次将数组的前n-1个元素取出,然后相邻两个元素依次 ...
- 常见排序算法总结:插入排序,希尔排序,冒泡排序,快速排序,简单选择排序以及java实现
今天来总结一下常用的内部排序算法.内部排序算法们需要掌握的知识点大概有:算法的原理,算法的编码实现,算法的时空复杂度的计算和记忆,何时出现最差时间复杂度,以及是否稳定,何时不稳定. 首先来总结下常用内 ...
- java,桶排序,冒泡排序,快速排序
1.桶排序: 百度百科:桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里.每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排 ...
- Java中选择排序,冒泡排序,插入排序,快速排序
一:冒泡法排序 //冒泡排序 注:从小到大排 //特点:效率低,实现简单 //思想:每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素. 这只是冒泡排序 ...
- 程序员必知的8大排序(三)-------冒泡排序,快速排序(java实现)
程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现) 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现) 程序员必知的8大排序(三)-------冒 ...
- 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)
不多说,直接上干货! 插入排序包括直接插入排序.希尔排序. 1.直接插入排序: 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用 ...
- Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。
Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得 ...
随机推荐
- Joystick
Joystick相当于5个按键的集合,向上.下.左.右.中间5个方向接通,经常用于游戏场合.
- C8051特点
C8051与传统51的区别在于优先权交叉开关.系统时钟.SFR寄存器几个方面: 一 优先权交叉开关:传统的51外设功能是固定分配或者复用分配到指定引脚,而C8051则是通过优先权交叉开关设置,即要想分 ...
- PHP在不同页面间传递Json数据示例代码
gettest.php文件: <?php $value["name"]= urlencode("我的姓名"); $value["pass&quo ...
- Android性能分析工具Profile GPU rendering详细介绍
如何在一个应用中追踪和定位性能问题,甚至在没有它的源代码的情况下?? “Profile GPU rendering”(GPU渲染分析),一款Android4.1所引入的工具.你可以在“设置”应用的“开 ...
- linux系统中文件的几种类型
Linux系统是以文件的形式来进行管理的.Linux文件类型常见的有:普通文件.目录.字符设备文件.块设备文件.符号链接文件等,如果想了解这方面知识的弟兄,就进来了解了解. Linux系统不同于win ...
- git设置log的别名 for hist
hist -- alias for 'log --color --graph --date=short --pretty=format:'%Cred%h%Creset -%C(yellow)%d%C ...
- 合并百度影音的离线数据 with python 2.3 格式更新
很久没有更新了. 这次新增支持四种格式的解析. filelist slicelist download.cfg third_party_download.cfg 还是2个文件.替换之前版本即可. 初步 ...
- svn批处理语句
sc create SVNService binpath="O:\ProgramingSoftware\SuiVersion\bin\svnserve.exe --service -r E: ...
- unix网络编程-配置unp.h头文件
第一步进入:www.unpbook.com,下载unp的随书代码.新建一个目录,将压缩包拷贝到这一目录下面,然后将压缩包直接解压:tar -zxvf 压缩包名.tar.gz 完成上一步后,进入到un ...
- Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/config/spring/applicationContext.xml]
在搭建SpringMVC框架的时候遇到了这个问题 问题的原因: 就是没有找到applicatoincontext.xml这个文件, 因为idea自动生成的路径不正确 因此需要再web.xml里面, ( ...