方法2019

opyright © 1999-2019, CSDN.NET, All Rights Reserved

搜索博文/帖子/用户

c# 排序算法【动画】诠释排序过程【一】【冒泡排序,选择排序,插入排序,归并排序,快速排序】 原创

以笑对世~

2018-09-06 阅读数:1842

关注
目录

  1. 冒泡排序(bubble sort)

  2. 选择排序(selection sort)

  3. 插入排序(insertion sort)

  4. 归并排序(merge sort)

  5. 快速排序(quicksort)

排序算法比较

其他排序算法动画图 请期待 排序算法【动画】诠释排序过程【二】

语言:c#

Demo地址【Unity c#】:https://download.csdn.net/download/qq_30259857/10903321

  1. 冒泡排序(bubble sort)
    每一次排序过程:

介绍:冒泡排序是一种最简单的排序算法。冒泡排序得名与键值较小的元素如同“气泡”一样逐渐到序列的顶端。
优点:最简单的排序算法,
缺点:
慢,每次只能移动相邻两个数据
实现逻辑:基本思想是迭代的对输入序列中的第一个元素到最后一个元素进行两两比较,当需要时交换这两个位置。该过程持续迭代直到在一堂排序过程中不需要交换操作为止。
性能:
最坏情况下时间复杂度:O(n平方)

最好情况下时间复杂度:O(n)
平均情况下时间复杂度:O(n平方)
最坏情况下空间复杂度:O(1)
代码
大众版:

    int[] arr = { 1, 7, 3, 6, 2 };
    for (int i = arr.Length - 1; i >= 0; i--)
    {
        for (int j = 0; j < i ; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }

改进版:在排序过程中,没有交换操作则意味着排序完成。如果序列已经是有序的,则可以通过判断该标记来结束算法

int[] arr = { 1, 7, 3, 6, 2 };
bool isSort = true; //加此字段为 改进版
for (int i = arr.Length - 1; i >= 0 && isSort; i–)
{
isSort = false;
for (int j = 0; j < i ; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
isSort = true;
}
}
}

  1. 选择排序(selection sort)
    每一次排序过程

介绍:选择排序是一种原地排序算法,适用于小文件。由于它重复选择最小的元素所以称之为选择排序。
优点:
容易实现
原地排序(不需要额外的存储空间)
移动数据的次数已知(n-1次);
缺点:
扩展性较差
比较次数多
实现逻辑:
寻找序列中的最小值
用当前的值交换最小值
对所有元素重复上述过程,直到整个序列排序完成
性能:
最坏情况下时间复杂度:O(n平方)

最好情况下时间复杂度:O(n)
平均情况下时间复杂度:O(n平方)
最坏情况下空间复杂度:O(1)
代码
int[] arr = { 5, 7, 3, 6, 4 };
int min = 0;
for(int i = 0; i <= arr.Length - 1; i++)
{
min = i;
for (int j = i + 1; j < arr.Length; j++)
{
if(arr[j] < arr[min])
{
min = j;
}
}
int temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}

  1. 插入排序(insertion sort)

介绍:插入排序是一种简单且有效的比较排序算法。
优点:
实现简单

数据量较少时效率高

适应性:如果输入序列已预排序,则时间复杂度为O(n+d),d是反转的次数

实际运行效率优于"选择排序"和"冒泡排序"

稳定性:键值相同时它能保持输入数据的原有次序

原地:仅需要常量O(1)的辅助内存空间

即时:插入排序能够在接收序列的同时对其进行排序

缺点:

比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。

实现逻辑:
原文:插入排序重复如下过程:每次从输入数据中移除一个元素并将其插入已排序序列的正确位置,直到所有输入元素都插入有序序列中。插入排序是典型的原地排序,经过k次迭代后数组具有性质:前k+1个元素已经排序。
代码
int val, j;
int[] arr = { 4, 2, 3, 1, 5 };
for (int i = 1; i < arr.Length; i++)
{
val = arr[i];
j = i;
while (j >= 1 && arr[j - 1] > val)
{
arr[j] = arr[j - 1];
j–;
}
arr[j] = val;
}
😁排序基本相似

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值