C#排序算法学习笔记

注:都是最简单的方法实现的排序,主要是学习其中的基本原理

1.冒泡排序

static void Main(string[] args)
        {
            int[] arr = new int[] { 9, 50, 5, 66 };
            for (int i = 0; i < arr.Length-1; i++)
            {
                for (int j = 0; j < arr.Length-i-1; j++)
                {
                    if (arr[j] > arr[j + 1])
                    {
                        int temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
            }
            for (int i = 0; i < arr.Length; i++)
            {
                Console.WriteLine(arr[i]);
            }
            Console.ReadLine();
        }

2.插入排序

static void Main(string[] args)
        {
            int[] arr = { 9, 8, 7, 4, 6, 99, 5, 1, 3, 0 };

            InsertSort(arr);
            foreach (var item in arr)
            {
                Console.WriteLine(item + " ");
            }

            Console.ReadLine();
        }

        static void InsertSort(int[] arr)
        {
            //for循环先拿出数组中的第二条数据
            //因为要与前边的数据进行对比所以取第二条开始比较
            for (int i = 1; i < arr.Length; i++)
            {
                //拿第一层for循环拿到的数据
                //对他前边的所有数据进行比较
                for (int j = i; j > 0; j--)
                {
                    //如果前边的数据比它大,则交换两条数据的位置
                    if (arr[j] < arr[j - 1])
                    {
                        (arr[j], arr[j - 1]) = (arr[j - 1], arr[j]);
                    }
                    else//如果前边的数据比他小或者是和他相等,则不需要移动交换数据,跳出for循环
                        //让他与前边的其他元素进行比较
                    {
                        break;
                    }
                }
            }
        }

3.快速排序

 static void Main(string[] args)
        {
            int[] arr = { 9, 8, 7, 4, 6, 99, 5, 1, 3, 0 };
            QuickSort(arr, 0, arr.Length - 1);
            foreach (var item in arr)
                Console.WriteLine(item + " ");
            Console.ReadLine();

        }
        static int GetPrivot(int[] arr, int left, int right)
        {
            //选择左边第一个值作为Privot,也可拿右边,也可随意选取数组中的某一条数据作为Privot
            int privot = arr[left];
            //使用while进行数据的比较>移动>完成划分
            //while循环满足left=right时即左右下标相遇,数组划分完成
            while (left < right)
            {
                //如果右标识大于Privot,则不需要移动,将右边标识下标自减,让其与下一个数值进行对比
                //如果对比数值比privot小时,则需要将该值移动到privot的左边,即可以用交换数据的位置来完成数据的移动
                while (left < right && arr[right] >= privot) right--;
                //此处与Swap()功能相同,即数据的交换
                (arr[right], arr[left]) = (arr[left], arr[right]);
                //完成右边数据的比较之后,则需要进行左边的数据移动
                while (left < right && arr[left] <= privot) left++;
                (arr[left], arr[right]) = (arr[right], arr[left]);

            }
            //整个循环结束之后,返回left的下标,即privot的下标
            return left;
        }

        static void QuickSort(int[] arr, int left, int right)
        {
            //此处开始数组的排序,首先需要获取到Privot,同时将原数组划分为两个区域
            //即privot左边都要小于Privot的值,右边反之
            if (left < right)
            {
                int privot = GetPrivot(arr, left, right);
                //划分完成之后,递归,将左右两边按照Getprivot的方法进行区域的划分
                //递归到没有元素进行移动时,即完成排序
                QuickSort(arr, privot + 1, right);
                QuickSort(arr, left, privot - 1);
            }
        }

4.选择排序

 static void Main(string[] args)
        {

            int[] arr = { 5, 8, 6, 0, 9, 2, 4, 3, 5, 1 };
            SelectSort(arr);
            foreach (var item in arr)
                Console.WriteLine(item);
            Console.ReadLine();
        }
        static void SelectSort(int[] arr)
        {
            for (int i = 0; i < arr.Length - 1; i++)
            {
                //首先需要获取到最小值
                int minIndex = i;
                //从第二个值开始遍历
                for (int j = i + 1; j < arr.Length; j++)
                {
                    //拿下一个值跟最小值作比较,记录最小值索引
                    if (arr[j] < arr[minIndex])
                        minIndex = j;
                }
                //一轮比较之后,最小值的索引已经得到,然后进行数据的交换
                (arr[i], arr[minIndex]) = (arr[minIndex], arr[i]);
            }
        }

5.希尔排序

 static void ShellSort(int[] arr)
        {
            //第一次取其一半作为递减增量,后续取上一次递减增量的一半
            for (int d = arr.Length / 2; d > 0; d /= 2)
            {
                //使用插入排序,对使用递减增量划分之后的序列进行排序
                for (int i = d; i < arr.Length; i++)
                {
                    if (arr[i] < arr[i - d])
                    {
                        //声明零时变量用来存储当前用于和其他数值比较的数值
                        int temp = arr[i], j;
                        //循环于之前的相距递减增量间隔的数值进行对比,大于之前不交换数据
                        for (j = i - d; j >= 0 && temp < arr[j]; j -= d)
                            arr[j + d] = arr[j];
                        arr[j + d] = temp;
                    }

                }

            }
        }

6.归并排序

static void Main(string[] args)
        {
            int[] arr = { 4, 5, 3, 2, 1, 7, 6, 9, 8, 10 };
            MergeSort(arr, 0, arr.Length - 1);

            foreach (var item in arr)
            {
                Console.WriteLine(item);
            }

            Console.ReadLine();
        }
        static void MergeSort(int[] arr, int f, int e)
        {
            if (f < e)
            {
                int middle = (e + f) / 2;
                MergeSort(arr, f, middle);
                MergeSort(arr, middle + 1, e);
                MergeMethod(arr, f, middle, e);
            }
        }

        static void MergeMethod(int[] arr, int f, int m, int e)
        {
            //先申请空间,存储临时归并过的数据
            int[] tempArr = new int[e - f + 1];
            //从前后两个子序列的第一个元素开始比较
            //需要同时满足,前后两个序列的自增索引始终要小于子序列的末尾索引
            int fIndex = f, eIndex = m + 1, k = 0;
            while (eIndex <= e && fIndex <= m)
            {
                //既然满足了循环的条件,则从两个子序列的第一个元素开始相互比较
                if (arr[fIndex] > arr[eIndex])
                {
                    //将小的一个放到临时数组的前边,大的放后边
                    tempArr[k++] = arr[eIndex++];
                }
                else
                {
                    //否则反之
                    tempArr[k++] = arr[fIndex++];
                }
            }
            //当归并比较循环结束后,若还有没有比较的元素直接赋值到零时数组的末尾
            //使用两个while循环分别检查前后两个序列,是哪一个还有剩余的元素
            while (fIndex < m + 1)
            {
                tempArr[k++] = arr[fIndex++];
            }
            while (eIndex < e + 1)
            {
                tempArr[k++] = arr[eIndex++];
            }
            //将剩余的元素复制到临时数组之后,在将零时数组的值移动到原数组中
            for (k = 0, fIndex = f; fIndex < e + 1; k++, fIndex++)
            {
                arr[fIndex] = tempArr[k];
            }

        }

~~~~~~持续更新

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Winjet_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值