C#中常用的几种排序算法

这篇博客总结了C#中常用的排序算法,包括稳定和不稳定的算法。提供了具体的代码实现,帮助开发者在不同场景下选择合适的排序方法。
摘要由CSDN通过智能技术生成


没事总结了一下平时C#中比较常见的排序算法,其中有稳定的 也有不稳定的,使用时自行斟酌,下面是具体脚本:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class Program
    {
        int[] data = { 5, 6, 9, 8, 7, 2, 3, 1, 4, 0 };
        int temp;

        //选择排序 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置  (不稳定)
        void Select()
        {
            for (int i = 0; i < data.Length - 1; i++)
            {
                for (int j = i + 1; j < data.Length; j++)
                {
                    if (data[i] > data[j])
                    {
                        temp = data[i];
                        data[i] = data[j];
                        data[j] = temp;
                    }
                }
            }

        }

        /*  --------------------------------------------------------------------------------------------------------------------------------*/

        //冒泡排序   比较相邻两数,每次最后一个元素就是最小或者最大,重复以上操作,出了最后一位,没执行一次 次数-1  (稳定)
        void Maopao()
        {
            for (int i = 0; i < data.Length - 1; i++)
            {
                for (int j = 0; j < data.Length - 1 - i; j++)
                {
                    if (data[j] > data[j + 1])
                    {
                        temp = data[j];
                        data[j] = data[j + 1];
                        data[j + 1] = temp;
                    }

                }
            }
        }

        /*  --------------------------------------------------------------------------------------------------------------------------------*/

        //插入排序  每次循环都是将该数与之前的所有数作比较,找到合适的位置插入(替换)          (稳定)
        void Insert()
        {
            for (int i = 1; i < data.Length; i++)
            {
                for (int j = i; j > 0; j--)
                {
                    if (data[j - 1] > data[j])
                    {
                        temp = data[j - 1];
                        data[j - 1] = data[j];
                        data[j] = temp;
                    }
                }
            }

        }


        /*  --------------------------------------------------------------------------------------------------------------------------------*/


        //快速排序   (不稳定)  意在将一组数据分为两组,其中一组的所有数据都大于或者小于另外一组数据。设定第一个数为基数,从右往左找比它小的数,从左往右找比它大的数,注意顺序,一定是先从右往左再从左往右,找到之后将两者交互,等到二者相遇时,将相遇的点设为基数点,将原先设定的基数点的数值赋值给相遇点。
        void Quick_Sort(int left, int right)
        {
            int i, j, temp,t;
            if (left > right) return;

            //设置基数  设置最左边的数位基数
            temp = data[left];
            i = left;
            j = right;
            //执行的条件,当i=j时回归基数
            while (i != j)
            {
                //注意顺序 一定是先右往左找到比基数小的数,再从左往右找到比基数大的数,然后交换两个数的位置
                while (data[j] >= temp && i < j) j--;
                while (data[i] <= temp && i < j) i++;
                if (i < j)
                {
                    t = data[i];
                    data[i] = data[j];
                    data[j] = t;
                }

            }

            //i=j 回归基数
            data[left] = data[i];
            data[i] = temp;

            //执行a[i](基数)前面一段的排序
            Quick_Sort( left, i - 1);
            //执行a[i](基数)后面一段的排序
            Quick_Sort( i + 1, right);

        }

        static void Main(string[] args)
        {

           Program p = new Program();
           p.Quick_Sort(0,p.data.Length-1);

            //输出排序后的数
           for (int i = 0; i < p.data.Length; i++)
             {
                 Console.Write(p.data[i] + " ");
             }
            Console.ReadKey();
        }
    }
}


以下是C#实现的几种常见排序算法示例: 1. 冒泡排序 ```csharp static void BubbleSort(int[] arr) { int len = arr.Length; for (int i = 0; i < len - 1; i++) { for (int j = 0; j < len - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ``` 2. 选择排序 ```csharp static void SelectionSort(int[] arr) { int len = arr.Length; for (int i = 0; i < len - 1; i++) { int minIndex = i; for (int j = i + 1; j < len; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } if (minIndex != i) { int temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } } } ``` 3. 插入排序 ```csharp static void InsertionSort(int[] arr) { int len = arr.Length; for (int i = 1; i < len; i++) { int temp = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > temp) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = temp; } } ``` 4. 快速排序 ```csharp static void QuickSort(int[] arr, int left, int right) { if (left < right) { int pivot = Partition(arr, left, right); QuickSort(arr, left, pivot - 1); QuickSort(arr, pivot + 1, right); } } static int Partition(int[] arr, int left, int right) { int pivot = arr[right]; int i = left - 1; for (int j = left; j < right; j++) { if (arr[j] < pivot) { i++; int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } int temp2 = arr[i + 1]; arr[i + 1] = arr[right]; arr[right] = temp2; return i + 1; } ``` 5. 归并排序 ```csharp static void MergeSort(int[] arr, int left, int right) { if (left < right) { int mid = (left + right) / 2; MergeSort(arr, left, mid); MergeSort(arr, mid + 1, right); Merge(arr, left, mid, right); } } static void Merge(int[] arr, int left, int mid, int right) { int[] temp = new int[right - left + 1]; int i = left; int j = mid + 1; int k = 0; while (i <= mid && j <= right) { if (arr[i] < arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } for (int m = 0; m < temp.Length; m++) { arr[left + m] = temp[m]; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值