常用的排序算法

c# 排序算法

1-冒泡排序:

在这里插入图片描述冒泡排序在数量大的时候效率不高,适合一般数据量较少的情况下使用

 public static int[] Sort(int[] arr)
        {
            if(arr.Length==0)
            {
                return arr;
            }
            else
            {
                for (int i = 0; i < arr.Length; i++)//比较的趟数
                {
                    for (int j = 0; j < arr.Length-1-i; j++)//每趟比较的次数
                    {
                        if(arr[j]>arr[j+1])
                        {
                            int temp = arr[j + 1];
                            arr[j + 1] = arr[j];
                            arr[j] = temp;
                        }
                    }
                }
                return arr;
            }
        }
2-插入排序:

思想:
1 将整个数组分为有序和无序两个部分,有序在左边,无序在右边。
2 开始时有序部分只有数组元素的第一个(array[0]),其余的都是无序部分。
3 每次去除无序部分的第一个元素,把他加入到有序部分。假设插入到合适位置 index,则原来index 位置的元素以及它后面的元素都向右(后)移动一个 位置,则有序部分就增加一个元素。
4 一直到无序部分没有元素为止。
在这里插入图片描述

 public static void Sort2(int[] arr)
        {
            if (arr.Length == 0)
            {
                return;
            }
            else
            {
                for (int i = 1; i < arr.Length; i++)//遍历无序部分元素,arr[i] 是最左边的无序元素,每次循环把arr[i]插入到合适位置
                {
                    for (int j = 0; j < i; j++)//遍历有序部分元素
                    {
                        if(arr[j]>arr[i])//如果有序部分元素大于无序部分元素,把 arr[i]放到 arr[j] 位置
                        {
                            int temp = arr[i];//记录无序部分元素
                            for (int k = i; k > j; k--)//移动有序部分元素
                            { 
                                arr[k] = arr[k - 1];
                            }
                            arr[j] = temp;//把 arr[i]放到 arr[j] 位置
                            break;
                        }
                    }
                }
            }
        }
 public static int[] Sort(int[] arr)
        {
            if(arr.Length==0)
            {
                return arr;
            }
            else
            {
                int currwntNum;//需要对比的数
                for (int i = 0; i < arr.Length-1; i++)
                {
                    currwntNum = arr[i + 1]; //需要对比的数等于当前数前一位
                    int perIndex = i;//当前下标
                    while(perIndex>=0&&currwntNum<arr[perIndex]) //如果当前坐标大于等于0,并且需要对比的数小于当前坐标的数
                    {
                        arr[perIndex + 1] = arr[perIndex]; //数组中当前坐标前一位=需要对比的数(大的向后移动)
                        perIndex--;//坐标后退,(退出while循环的条件)
                    }
                    arr[perIndex + 1] = currwntNum; //需要对比的数等于数组中当前坐标前一位(插入)
                }
                return arr;
            }
        }
4-希尔排序:
 public static int[] Sort(int[] arr)
        {
            int len = arr.Length;
            int temp, gap = len / 2;
            while(gap>0)
            {
                for (int i = gap; i < len; i++)
                {
                    temp = arr[i];
                    int perIndex = i - gap;
                    while(perIndex>=0&&arr[perIndex]>temp)
                    {
                        arr[perIndex + gap] = arr[perIndex];
                        perIndex -= gap;
                    }
                    arr[perIndex + gap] = temp;
                }
                gap /= 2;
            }
            return arr;
        }
5-快速排序:
		 /// <summary>
        /// 对数组dataArray中索引从left到right之间的数做排序
        /// </summary>
        /// <param name="dataArray">要排序的数组</param>
        /// <param name="left">要排序数据的开始索引</param>
        /// <param name="right">要排序数据的结束索引</param>
        static void QuickSort(int[] dataArray, int left, int right)
        {
            if (left < right)
            {

                int x = dataArray[left];//基准数, 把比它小或者等于它的 放在它的左边,然后把比它大的放在它的右边
                int i = left;
                int j = right;//用来做循环的标志位

                while (true &&i<j )//当i==j的时候,说明我们找到了一个中间位置,这个中间位置就是基准数应该所在的位置 
                {

                    //从后往前比较(从右向左比较) 找一个比x小(或者=)的数字,放在我们的坑里 坑位于i的位置
                    while (true && i < j) {
                        if (dataArray[j] <= x) //找到了一个比基准数 小于或者等于的数子,应该把它放在x的左边
                    {
                            dataArray[i] = dataArray[j];
                            break;
                        } else {
                            j--;//向左移动 到下一个数字,然后做比较
                        }
                    }

                    //从前往后(从左向右)找一个比x大的数字,放在我们的坑里面 现在的坑位于j的位置
                    while (true && i < j) {
                        if (dataArray[i] > x) {
                            dataArray[j] = dataArray[i];
                            break;
                        } else {
                            i++;
                        }
                    }

                }

                //跳出循环 现在i==j i是中间位置
                dataArray[i] = x;// left -i- right

                QuickSort(dataArray,left,i-1);
                QuickSort(dataArray,i+1,right);
            }
        }
6-简单选择排序:

在这里插入图片描述
每次找出当前的最小值。

 public static int[] Sort(int[] arr)
        {
            if(arr.Length==0)
            {
                return arr;
            }
            else
            {
                for (int i = 0; i < arr.Length; i++)
                {
                    int minIndex = i;//最小元素索引
                    for (int j = i; j < arr.Length; j++)
                    {
                        if(arr[j]<arr[minIndex]) //找到最小数
                        {
                            minIndex = j; //保存最小数的索引
                        }
                    }
                    //交换元素
                    int temp = arr[minIndex];
                    arr[minIndex] = arr[i];
                    arr[i] = temp;
                }
                return arr;
            }
        }

优化版:

 static void SelectSort(int[] dataArray)
        {
            for (int i = 0; i < dataArray.Length-1; i++)
            {
                int min = dataArray[i];//记录最小值。 假设第 i 个最小,一般从数组下标为 0 的元素开始
                int minIndex = i;//记录最小值所在的索引
                for (int j = i+1; j < dataArray.Length; j++)//从 i+1 元素开始依次比较
                {
                    if (dataArray[j] < min)//如果比 min 小
                    {
                        min = dataArray[j];//交换两个变量的值
                        minIndex = j; //交换下标
                    }
                }//循环结束后 min存储最小值,minIndex存储最小值下标
                if (minIndex != i)//如果最小值下标等于 i ,交换两个元素位置
                {
                    int temp = dataArray[i];
                    dataArray[i] = dataArray[minIndex];
                    dataArray[minIndex] = temp;
                }
            }
        }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值