C#常用的排序方法

冒泡排序(Bubble Sort)

基本思路是:将相邻的记录的关键码进行比较,若前面记录的关键码大于后面记录的关键码,则将它们交换,否则不交换。
在这里插入图片描述

static void Sort(int[] arrNum)//传递一个数组排序
{
	//冒泡排序
	for (int i = 0; i < arrNum.Length-1; i++)
	{
	    for (int j = 0; j < arrNum.Length-1-i; j++)
	    {
	        if (arrNum[j]>arrNum[j+1])
	        {
	            int temp = arrNum[j];
	            arrNum[j] = arrNum[j+1];
	            arrNum[j+1] = temp;
	        }
	    }
	}
 }

方法二

 static void Sort(int[] sortArray)//传递一个数组排序
        {
            bool swapped ;
            do
            {
                swapped = false;//如果不发生交换,do-while则跳出循环
                for (int i = 0; i < sortArray.Length-1; i++)
                {
                    if (sortArray[i]>sortArray[i+1])
                    {
                        int temp = sortArray[i];
                        sortArray[i] = sortArray[i + 1];
                        sortArray[i + 1] = temp;
                        swapped = true;//如果发生交换,do-while则继续循环
                    }
                }
            } while (swapped);
        }

简单选择排序(Simple Select Sort)算法

基本思路是:
从左到右开始,以第一个元素 (i = 0) 作为 基准数,与后面的数作比较,找到比它小的数就置换位置,以此类推 ,以第二元素(i = 1) 作为 基准数,与后面的数比较,找到比它小的数就置换位置.直至循环结束.

在这里插入图片描述

//选择排序
static void SelectSort(int[] dataArray)
{
    for (int i = 0; i < dataArray.Length - 1; i++)
    {
        //记录最小值索引
        int minIndex = i;
        for (int j = i + 1; j < dataArray.Length; j++)
        {
            if (dataArray[j] < dataArray[minIndex])
            {
                minIndex = j;
            }
        }
        //交互最小值 : 当前索引就是最小值时就不用交换
        if (minIndex != i)
        {
            int temp = dataArray[i];
            dataArray[i] = dataArray[minIndex];
            dataArray[minIndex] = temp;
        }
    }
}

插入排序

基本思路是:依照从左到右顺序,从第(i = 1)元素开始,把 i 与它前面的数比较,找到小于它的数就移动元素位置
在这里插入图片描述

static void InsertSort(int[] dataArray)
        {
            for (int i = 1; i < dataArray.Length; i++)
            {
                int iValue = dataArray[i];
                bool isInsert = false;
                //拿到i位置的元素 跟前面所有的元素作比较
                for (int j = i - 1; j >= 0; j--)
                {
                    if (dataArray[j] > iValue)
                    {
                        //如果发现比i大的,就让它向后移动
                        dataArray[j + 1] = dataArray[j];
                    }
                    else
                    {
                        //发现一个比i小的值就停下来
                        dataArray[j + 1] = iValue;
                        isInsert = true;
                        break;
                    }
                }
                //如果i这个值最小,所有元素都向后移动一位了,就把这个元素放到 0 号索引上
                if (isInsert == false)
                {
                    dataArray[0] = iValue;
                    Console.WriteLine(iValue);
                }
            }
        }

快速排序

快速排序是几种排序方法中效率较高,因此经常被采用,采用快速排序思想----分治法 (Divide-and-ConquerMethod)。

该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。

快速排序详细步骤

以一个数组作为示例,取区间第一个数为基准数。
在这里插入图片描述
初始时,i = 0; j = 9; X = a[i] = 72
由于已经将a[0]中的数保存到X中,可以理解成在数组a[0]上挖了个坑,可以将其它数据填充到这来。
从j开始向前找一个比X小或等于X的数。当j=8,符合条件,将a[8]挖出再填到上一个坑a[0]中。a[0]=a[8]; i++; 这样一个坑a[0]就被搞定了,但又形成了一个新坑a[8],这怎么办了?简单,再找数字来填a[8]这个坑。这次从i开始向后找一个大于X的数,当i=3,符合条件,将a[3]挖出再填到上一个坑中a[8]=a[3]; j–;
数组变为:
在这里插入图片描述
i = 3; j = 7; X=72
再重复上面的步骤,先从后向前找,再从前向后找。
从j开始向前找,当j=5,符合条件,将a[5]挖出填到上一个坑中,a[3] = a[5]; i++
从i开始向后找,当i=5时,由于i==j退出。
此时,i = j = 5,而a[5]刚好又是上次挖的坑,因此将X填入a[5]。
数组变为:
在这里插入图片描述
可以看出a[5]前面的数字都小于它,a[5]后面的数字都大于它。因此再对a[0…4]和a[6…9]这二个子区间重复上述步骤就可以了。

static void QuickSort(int[] dataArray, int left, int right)
{
    if (left < right)
    {
        //基准数, 把比它小或者等于它的 放在它的左边,然后把比它大的放在它的右边
        int x = dataArray[left];
        int i = left;
        int j = right;

        while (i < j)//当i==j的时候,说明我们找到了一个中间位置,这个中间位置就是基准数应该所在的位置 
        {
            //从后往前比较
            //找到了一个比基准数 小于或者等于的数子,应该把它放在x的左边
            while (i < j)
            {
                if (dataArray[j] <= x)
                {
                    dataArray[i] = dataArray[j];
                    break;
                }
                else
                {
                    j--;//向左移动 到下一个数字,然后做比较
                }
            }
            //从前往后
            while (i < j)
            {
                if (dataArray[i] > x)
                {
                    dataArray[j] = dataArray[i];
                    break;
                }
                else
                {
                    i++;
                }
            }
        }
        //跳出循环 现在i==j i是中间位置
        dataArray[i] = x;
        QuickSort(dataArray, left, i - 1);// left -i- right
        QuickSort(dataArray, i + 1, right);
    }
}

调用

QuickSort(data, 0, data.Length - 1);

CLR提供的排序方法:Array.Sort()

评论 2 您还未登录,请先 登录 后发表或查看评论
相关推荐

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页

打赏作者

戒生

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值