IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C#(C sharp)四种简单的排序及优劣(菜鸟理解版) 1、冒泡排序2、直接插入排序3、选择排序4、希尔排序 -> 正文阅读

[数据结构与算法]C#(C sharp)四种简单的排序及优劣(菜鸟理解版) 1、冒泡排序2、直接插入排序3、选择排序4、希尔排序

目录

序言

省流:

1、冒泡排序

2、直接插入排序

3、选择排序

4、希尔排序

1、冒泡排序

优点:

具体实现:

2、插入排序

?实现

3、选择排序

基本原理

优点:

实现

4、希尔排序

以下方式均为摘抄

详细步骤请移步


序言

在排序中有四种排序,其中冒泡排序是基本上每个新手都会经历的,但是还有另外三种排序,是大部分教程所没有的,分别是直接插入排序和选择排序,即最不常用的希尔排序。

四种排序的优劣

省流:

1、冒泡排序

用的是遍历的方式,将每一个数组的元素两两进行对比,谁小谁去前面,然后for循环一遍。优点是最适合讲解排序的意义,帮助新手理解循环和排序,但是计算量太大,从头到尾算一遍。

2、直接插入排序

把一个原来的数组的元素,一个个切片出来,然后插入到新的数组中,在这个新的数组中进行排序。优点就是计算量少。

3、选择排序

从一个数组中,选出最大或者最小的哪一个,放在新数组的第一位,然后依次循环

优点:优点就是计算量少,一次成功

4、希尔排序

希尔排序利用了插入排序的一个特点来优化排序算法,插入排序的这个特点就是:当数组基本有序的时候,插入排序的效率比较高

这里仅做说明,不做详细解释,尊重原作者,请移步

Csharp四种简单的排序算法_饅頭的博客-CSDN博客_c# 算法

不过总结来说,就是先把数组拆分多个小数组,然后小数组先排序,然后就基本有序,再继续合道大的数组进行排序。

1、冒泡排序

冒泡排序用的是遍历的方式,将每一个数组的元素两两进行对比,谁小谁去前面。

?然后使用for循环,将每一个元素进行对比,重新排列

优点:

简单易懂,能够帮助初学者快速理解for循环和排序

缺点,处理大型数组的时候,计算量大,面对一些有一定规律的数组,不能更加快速排序

具体实现:

以小到大进行循环

using System;
namespace ConsoleApp2
{
    class Program
    {
        public static void Main(string[] args)
        {
            //冒泡排序的核心思想就是两两交换,谁小谁去前面
            //那么就剩下循环几次的问题
            int[] arr = new int[] { 64, 57, 25, 46, 95, 12, 35, 47, 55 };
           
            for (int i = 0; i <arr.Length ; i++)//外层循环计数,每减一,就运算一次
            {
                for(int j = 0; j < arr.Length-1; j++)//内层循环
                {
                    if (arr[j] > arr[j + 1])//当前者大于后者,就交换二者的值,但是不是全部循环
                    {
                        int temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
            }
        }
    }
}

2、插入排序

插入排序是较为简单的一个,将一个原来的数组,切片,然后一个个插入新的数组,当然每次 插入新的元素,都要进行一次排序。

优点:

就是交换次数要减少很多,运算量也少了很多。

?实现

using System;
namespace ConsoleApp2
{
    class Program
    {
        public static void Main(string[] args)
        {
            
            int[] arr = new int[] { 64, 57, 25, 46, 95, 12, 35, 47, 55 };
           //定义数组
            for (int i = 0; i <arr.Length ; i++)
                //循环访问数组中的元素
            {
                int temp = arr[i];
                //定义一个int变量,并使用获得数组元素值赋值
                int j=i;
                while ((j > 0) && (arr[j-1]>temp))
                 //判断数组中的原数是否大于获得的所有元素?
                {
                    arr[j] = arr[j - 1];
                   //如果是,则将最后一个元素的值提前

                    --j;
                }
                arr[j] = temp;
                //最后将int变量存储的值赋值给最后一个元素。
            }
            Console.WriteLine("循环排序后结果的为:");
            foreach (int n in arr)
                //循环打印
                Console.WriteLine("{0}", n + "");
            Console.WriteLine();
        }
    }
}

3、选择排序

基本原理

现在原有的数组上,进行排序,找到那个需要排序的,比如原数组最小或者最大的,把他挑出来放到新数组中,然后依次继续。

优点:

就是交换次数要减少很多,运算量也少了很多。

实现

using System;
namespace ConsoleApp2
{
    class Program
    {
        public static void Main(string[] args)
        {
           
            int[] arr = new int[] { 64, 57, 25, 46, 95, 12, 35, 47, 55 };
           //定义数组
            for (int i = 0; i <arr.Length -1; i++)
                //循环访问数组中的元素
            {
                int min = 0;//先定义min
                min = i;
                //为定义的数组下标赋值
                for(int j=i+1;j<arr.Length;j++)
                    //循环访问数组中的元素值
                {
                    if(arr[j] < arr[min])
                        //判断相邻元素两个元素值的大小
                    {
                        min = j;
                    }
                    int temp = arr[min];
                    //定义一个int变量,用来存储比较大的数组元素值
                    arr[min]=arr[i];
                    //交换小的下标位置
                    arr[i] = temp;
                    //将int变量中存储的较大的数组元素值向后移
                }
            }
            Console.WriteLine("循环排序后结果的为:");
            foreach (int n in arr)
                //循环打印
                Console.WriteLine("{0}", n + "");
            Console.WriteLine();
        }
    }
}

4、希尔排序

该排序书上未讲解,引用前辈方案。

以下方式均为摘抄

希尔排序利用了插入排序的一个特点来优化排序算法,插入排序的这个特点就是:当数组基本有序的时候,插入排序的效率比较高。比如对于下面这样一个数组:

int[] array = { 1, 0, 2, 3, 5, 4, 8, 6, 7, 9 };

插入排序的输出如下:

可以看到,尽管比较的趟数没有减少,但是交换的次数却明显很少。希尔排序的总体想法就是先让数组基本有序,最后再应用插入排序。具体过程如下:假设有数组int a[] = {42,20,17,13,28,14,23,15},不失一般性,我们设其长度为length。

第一趟时,步长step = length/2 = 4,将数组分为4组,每组2个记录,则下标分别为(0,4)(1,5)(2,6)(3,7);转换为数值,则为{42,28}, {20,14}, {17,23}, {13,15}。然后对每个分组进行插入排序,之后分组数值为{28,42}, {14,20}, {17,23}, {13,15},而实际的原数组的值就变成了{28,14,17,13,42,20,23,15}。这里要注意的是分组中记录在原数组中的位置,以第2个分组{14,20}来说,它的下标是(1,5),所以这两个记录在原数组的下标分别为a[1]=14;a[5]=20。

第二趟时,步长 step = step/2 = 2,将数组分为2组,每组4个记录,则下标分别为(0,2,4,6)(1,3,5,7);转换为数值,则为{28,17,42,23}, {14,13,20,15},然后对每个分组进行插入排序,得到{17,23,28,42}{13,14,15,20}。此时数组就成了{17,13,23,14,28,15,42,20},已经基本有序。

第三趟时,步长 step=step/2 = 1,此时相当进行一次完整的插入排序,得到最终结果{13,14,15,17,20,23,28,42}。

详细步骤请移步

Csharp四种简单的排序算法_饅頭的博客-CSDN博客_c# 算法

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 19:31:09  更:2022-08-19 19:33:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:25:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码