冒泡排序:就是两个两个的这个比较好理解,代码也比较好写出来。

      它的原理就是相邻的两个两个的比较,如果前面的数比后面的大,那么交换,它这个在比较完一次的时候可以得到最大的一个数,然后接着循环,每次外循环中内循环的次数比原来少一次。

      

#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(冒泡排序、直接排序、快速排序)的更多相关文章

  1. 归并排序 & 计数排序 & 基数排序 & 冒泡排序 & 选择排序 ----> 内部排序性能比较

    2.3 归并排序 接口定义: int merge(void* data, int esize, int lpos, int dpos, int rpos, int (*compare)(const v ...

  2. php基础排序算法 冒泡排序 选择排序 插入排序 归并排序 快速排序

    <?php$arr=array(12,25,56,1,75,13,58,99,22);//冒泡排序function sortnum($arr){    $num=count($arr);    ...

  3. [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序

    用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html  目录 马桶排序(令人 ...

  4. 数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现

    这五种排序算法难度依次增加. 冒泡排序: 第一次将数组相邻两个元素依次比较,然后将大的元素往后移,像冒泡一样,最终最大的元素被移到数组的最末尾. 第二次将数组的前n-1个元素取出,然后相邻两个元素依次 ...

  5. 常见排序算法总结:插入排序,希尔排序,冒泡排序,快速排序,简单选择排序以及java实现

    今天来总结一下常用的内部排序算法.内部排序算法们需要掌握的知识点大概有:算法的原理,算法的编码实现,算法的时空复杂度的计算和记忆,何时出现最差时间复杂度,以及是否稳定,何时不稳定. 首先来总结下常用内 ...

  6. java,桶排序,冒泡排序,快速排序

    1.桶排序: 百度百科:桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里.每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排 ...

  7. Java中选择排序,冒泡排序,插入排序,快速排序

    一:冒泡法排序  //冒泡排序 注:从小到大排   //特点:效率低,实现简单  //思想:每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素. 这只是冒泡排序 ...

  8. 程序员必知的8大排序(三)-------冒泡排序,快速排序(java实现)

    程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现) 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现) 程序员必知的8大排序(三)-------冒 ...

  9. 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)

    不多说,直接上干货! 插入排序包括直接插入排序.希尔排序. 1.直接插入排序: 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用 ...

  10. Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。

    Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得 ...

随机推荐

  1. hbuilder 中文乱码

    这是因为HBuilder默认文件编码是UTF-8,你可以在工具-选项-常规-工作空间选项中设置默认字符编码

  2. java自带线程池

    1. newSingleThreadExecutor 创建一个单线程的线程池.这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务.如果这个唯一的线程因为异常结束,那么会有一个新的线程来替 ...

  3. 503 Next Greater Element II 下一个更大元素 II

    给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它 ...

  4. Python打开目录下所有文件

    用Python打开指定目录下所有文件,统计文件里特定的字段信息. 这里是先进入2017-02-25到2017-03-03目录,然后进入特定IP段目录下,最后打开文件进行统计 import os, gl ...

  5. MySQL优化步骤和my.cnf优化配置

    1.查看机器配置,指三大件:cpu.内存.硬盘 2.查看mysql配置参数 3.查看mysql运行状态,可以用mysqlreport工具来查看 4.查看mysql的慢查询 依次解决了以上问题之后,再来 ...

  6. Visual Studio Code配置 HTML 开发环境

    Visual Studio Code配置 HTML 开发环境 https://v.qq.com/x/page/l0532svf47c.html?spm=a2h0k.11417342.searchres ...

  7. vue安装概要以及vue测试工具

    一.概述 1.安装node,去node官网 2.新建一个项目,通过npm init命令初始化,即创建一个package.json文件 3.用命令 npm install vue -g 全局安装vue( ...

  8. vba,自定义公式,农历互转公历,excel ,wps

    'vba 模块内容如下 自定义公式 '公历转农历模块 '原创:互联网 '修正: '// 农历数据定义 // '先以 H2B 函数还原成长度为 18 的字符串,其定义如下: '前12个字节代表1-12月 ...

  9. Redhat5 安装序列号及版本说明

    为了保证安装的组件和订阅相匹配,红帽企业 Linux 5 需要输入一个安装号.它被用来配置安装程序来提供正确的软件包.安装号码包含在你的订阅里. 如果您没有输入安装号码,只有核心服务器或 Deskto ...

  10. Unity查找物体的四大主流方法及区别

    GameObject.Find()优点: 使用简单方便不会因为重名而报错,同时查找的是自上而下的第一个物体缺点 不能查找被隐藏的物体,否则出现“空引用异常”,这是很多新人在查找出现空引用bug的原因. ...