zoukankan      html  css  js  c++  java
  • 算法:冒泡排序(Bubble Sort)、插入排序(Insertion Sort)和选择排序(Selection Sort)总结

    背景

    这两天温习了 5 中排序算法,之前也都看过它们的实现,因为没有深入分析的缘故,一直记不住谁是谁,本文就记录一下我学习的一些心得。

    三种排序算法可以总结为如下:

    • 都将数组分为已排序部分和未排序部分。
    • 冒泡排序将已排序部分定义在右端,在遍历未排序部分的过程执行交换,将最大元素交换到最右端。
    • 插入排序将已排序部分定义在左端,将未排序部分元的第一个元素插入到已排序部分合适的位置。
    • 选择排序将已排序部分定义在左端,然后选择未排序部分的最小元素和未排序部分的第一个元素交换。

    冒泡排序

    代码

     1         public static void Sort(T[] items)
     2         {
     3             if (items.Length < 2)
     4             {
     5                 return;
     6             }
     7 
     8             int swappedTimes;
     9             do
    10             {
    11                 swappedTimes = 0;
    12                 // 重复的遍历数组。
    13                 for (var i = 1; i < items.Length; i++)
    14                 {
    15                     // 每次遍历都比较两个元素,如果顺序不正确就把他们交换一下。
    16                     if (items[i - 1].CompareTo(items[i]) > 0)
    17                     {
    18                         Swap(items, i - 1, i);
    19                         swappedTimes++;
    20                     }
    21                 }
    22             } while (swappedTimes > 1);// 如果遍历后只交换了 1 次或 0 次,排序结束。
    23         }

    示例

    【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】

    插入排序

    代码

     1         public static void Sort(T[] items)
     2         {
     3             for (
     4                 var sortedRangeEndIndex = 1;
     5                 sortedRangeEndIndex < items.Length;
     6                 sortedRangeEndIndex++)
     7             {
     8                 if (items[sortedRangeEndIndex].CompareTo(items[sortedRangeEndIndex - 1]) < 0)
     9                 {
    10                     int insertIndex = FindInsertionIndex(items, items[sortedRangeEndIndex]);
    11                     Insert(items, sortedRangeEndIndex, insertIndex);
    12                 }
    13             }
    14         }
    15 
    16         private static int FindInsertionIndex(T[] items, T valueToInsert)
    17         {
    18             for (var i = 0; i < items.Length; i++)
    19             {
    20                 if (items[i].CompareTo(valueToInsert) > 0)
    21                 {
    22                     return i;
    23                 }
    24             }
    25 
    26             throw new InvalidOperationException();
    27         }
    28 
    29         private static void Insert(T[] items, int indexInsertingFrom, int indexInsertingAt)
    30         {
    31             var temp = items[indexInsertingFrom];
    32 
    33             for (var i = indexInsertingFrom; i > indexInsertingAt; i--)
    34             {
    35                 items[i] = items[i - 1];
    36             }
    37 
    38             items[indexInsertingAt] = temp;
    39         }

    示例

    【4,3,2,1】

    【3,4,2,1】

    【2,3,4,1】

    【1,2,3,4】

    选择排序

    代码

     1         public static void Sort(T[] items)
     2         {
     3             for (
     4                 var sortedRangeEndIndex = 0;
     5                 sortedRangeEndIndex < items.Length;
     6                 sortedRangeEndIndex++)
     7             {
     8                 int nextIndex = FindIndexOfSmallestFromIndex(items, sortedRangeEndIndex);
     9                 Swap(items, sortedRangeEndIndex, nextIndex);
    10             }
    11         }
    12 
    13         private static int FindIndexOfSmallestFromIndex(T[] items, int sortedRangeEndIndex)
    14         {
    15             T currentSmallItem = items[sortedRangeEndIndex];
    16             int currentSmllIndex = sortedRangeEndIndex;
    17 
    18             for (var i = sortedRangeEndIndex + 1; i < items.Length; i++)
    19             {
    20                 if (currentSmallItem.CompareTo(items[i]) > 0)
    21                 {
    22                     currentSmallItem = items[i];
    23                     currentSmllIndex = i;
    24                 }
    25             }
    26 
    27             return currentSmllIndex;
    28         }

    示例

    【4,3,2,1】

    【1,3,2,4】

    【1,2,3,4】

    【1,2,3,4】

    备注

    每周坚持学习数据结构和算法中。。。

  • 相关阅读:
    洛谷-P5734 【深基6.例6】文字处理软件
    洛谷-P5733 【深基6.例1】自动修正
    洛谷-P5730 【深基5.例10】显示屏
    洛谷-P2615 神奇的幻方
    栈和堆的狗屎笔记
    值类型和引用类型笔记(连接到栈和堆的芝士点)
    总结Linq或者lamdba的写法(2)
    安装VS和SQL的默认文件夹路径
    托管调试助手 "ContextSwitchDeadlock":“CLR 无法从 COM 上下文 0x2d59360 转换为 COM 上下文 0x2d592a8,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作。这种情况通常会影响
    超详细的Canal入门,看这篇就够了!
  • 原文地址:https://www.cnblogs.com/happyframework/p/3455798.html
Copyright © 2011-2022 走看看