• [Unity算法]交换排序(一):冒泡排序


    0.简介

    交换排序的基本思想是:两两比较,如果两个记录不满足次序要求,则进行交换,直到整个序列全部满足要求为止

    冒泡排序是一种最简单的交换排序方法,它通过两两比较相邻记录,如果发生逆序,则进行交换,从而使小的记录如气泡一样逐渐往上“漂浮”(左移),或者使大的记录如石块一样逐渐往下“坠落”(右移),即升序排列

    1.算法思想

    a.设待排序的记录存放在数组r[1..n]中。首先将第1个记录和第2个记录进行比较,若为逆序(r[1]>r[2]),则交换。然后比较第2个和第3个,依次类推,直到第n-1个和第n个比较完为止。上述过程称作第1趟排序,其结果使得最大的记录放到最后的位置上

    b.然后进行第2趟排序,对前n-1个记录进行同样操作,其结果使得次大的记录放到n-1的位置上

    c.重复上述过程,直到某一趟排序过程中没有进行过交换记录的操作,说明完成了排序

    例:

    起始:{1,2,5,4,3}

    第1趟:{1,2,4,3,5}

    第2趟:{1,2,3,4,5}

    第3趟:结束排序算法

    即每一趟确定1个记录的最终位置

    2.算法实现

     1 using System;
     2 using System.Collections.Generic;
     3 
     4 namespace TestSort
     5 {
     6     class Program
     7     {
     8         static void Main(string[] args)
     9         {
    10             List<int> list = new List<int> { 49, 38, 65, 97, 76, 13, 27, 49};
    11 
    12             Program p = new Program();
    13             p.Print(list, "排序前:");
    14             p.BubbleSort(list);
    15             p.Print(list, "排序后:");
    16             
    17             Console.ReadKey();
    18         }
    19 
    20         void Print(List<int> list, string tag)
    21         {
    22             string str = tag;
    23             for (int i = 0; i < list.Count; i++)
    24             {
    25                 str += list[i].ToString();
    26                 str += ",";
    27             }
    28             Console.WriteLine(str);
    29         }
    30 
    31         //冒泡排序
    32         void BubbleSort(List<int> list)
    33         {
    34             int m = list.Count - 1;
    35             int flag = 1;//flag用来标记某一趟排序是否发生交换(1表示进行了交换)
    36             while ((m > 0) && (flag == 1))
    37             {
    38                 flag = 0;//flag置为0,如果本趟排序没有发生交换,则不会执行下一趟排序
    39                 for (int j = 0; j < m; j++)
    40                 {
    41                     if (list[j] > list[j + 1])
    42                     {
    43                         flag = 1;
    44 
    45                         //交换
    46                         int temp = list[j];
    47                         list[j] = list[j + 1];
    48                         list[j + 1] = temp;
    49                     }
    50                 }
    51                 m--;
    52             }
    53         }
    54     }
    55 }

    結果:

    3.算法分析

    a.时间复杂度

    最好情况(初始序列为正序):只需进行一趟排序

    最坏情况(初始序列为正序):需进行n-1趟排序

    平均情况:O(n2)

    b.空间复杂度

    只有在交换时需要一个辅助空间用做暂存记录,所以为O(1)

    4.算法特点

    a.是稳定排序

    b.可提前结束算法

    c.当初始记录无序,n较大时,此算法不宜采用

  • 相关阅读:
    在WPF中添加Windows Form控件
    LIST对象排序问题
    C# TreeView树节点上下移动
    C# listbox的上下移动,拖动排序,两个listbox相互拖动
    Nmap 扫描并生成HTML报告
    Windows 10 系统精简方案参考
    Windows10 子系统 Ubuntu安装
    VS2012 RC页面检查器
    新增功能.NET 框架 4.5 RC
    PowerPoint Storyboarding:Visual Studio 2012 RC带给开发者的秘密杀器
  • 原文地址:https://www.cnblogs.com/lyh916/p/12435657.html
Copyright © 2020-2023  润新知