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

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

      

#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. Dapper系列之三:Dapper的事务修改与删除

    Dapepr的Update和Delete Dapper入门Dapper查询 上两篇文章我们介绍Dapper中添加和查询.本篇文章我们继续讲解修改和删除....如果本篇文章看不懂,请看阅读上两篇Dapp ...

  2. datetime 模块详解

    1.import datetime 常用方法: ttimedelta() 括号里默认为days,进行别的单位运算可以加上如hours = 1这样.除了进行减法运算,还可以进行加法运算. >> ...

  3. CF778A(round 402 div.2 D) String Game

    题意: Little Nastya has a hobby, she likes to remove some letters from word, to obtain another word. B ...

  4. spark性能优化-JVM虚拟机垃圾回收调优

    1 2 3 4

  5. FPGA原型验证

    为什么要做FPGA原型验证? FPGA原型验证可以在IC流片前对芯片功能和性能做出评估,同时,可以给软件设计人员提供验证平台.所有的设计,无论是SOC还是ASIC都需要被验证(功能和时序验证),以确保 ...

  6. UART协议

    通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,通常称作UART,读音/ˈjuːart/)是一种异步收发传输器,是电脑硬件的一部分,将资料由 ...

  7. 最简单的教程:在Ubuntu操作系统里安装Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...

  8. Keil Debug (printf) Viewer

    Debug (printf) Viewer Home » µVision Windows » Debug (printf) Viewer The Debug (printf) Viewer windo ...

  9. 公共dao的抽取

    package cn.sxx.dao; import java.util.List; import cn.sxx.model.Dep; import cn.sxx.query.DepQuery; pu ...

  10. Sql Server 中锁的概念(1)

    Sql Server 中锁的概念   锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破 ...