C# 选择排序、冒泡排序、插入排序、快排(左边、中间、随机)

        static void Swap(ref int a, ref int b)
        {
            if (a == b)
                return;
            a = (b ^= a ^= b) ^ a;
        }
        static void Swap(int[] arr, int i, int j)
        {
            if (i == j)
                return;
            Swap4(ref arr[i], ref arr[j]);
        }

Swap是一个简单的元素值交换,这里不多介绍。

        /// <summary>
        /// 冒泡排序
        /// </summary>
        /// <param name="data"></param>
        static void BubbleSort(int[] data)
        {
            int i, j;
            for (i = 0; i < data.Length; i++)
            {
                for (j = 0; j < data.Length - 1; j++)
                {
                    if (data[j] > data[j + 1])
                    {
                        Swap(data,j+1, j);
                    }
                }
            }
        }
       /// <summary>
       /// 选择排序
       /// </summary>
       /// <param name="list"></param>
        static void SelectionSort(int[] list)
        {
            int i, j, min_index;
            for (i = 0; i < list.Length - 1; i++)
            {
                min_index = i;
                for (j = i + 1; j < list.Length; j++)
                {
                    if (list[j] < list[min_index])
                    {
                        min_index = j;
                    }
                }
                if (min_index != i)
                    Swap(list,min_index, i);
            }
        }
        /// <summary>
        /// 插入排序
        /// </summary>
        /// <param name="arr"></param>
        static void InsertSort(int[] arr)
        {
            int i, j, key;
            for (j = 1; j < arr.Length; j++)
            {
                key = arr[j];
                i = j - 1;
                while (i >= 0 && arr[i] > key)
                {
                    arr[i + 1] = arr[i];
                    i--;
                }
                arr[i + 1] = key;
            }
        }

以下是快排

        static Random random = new Random();
        public static void quickSort(int[] arr)
        {
            if (arr == null || arr.Length < 2)
                return;

            process(arr, 0, arr.Length - 1);
        }
        public static void process(int[] arr, int L, int R)
        {
            if (L >= R) return;
            // 取随机数为基准数
            int temp = random.Next(L, R + 1);
            // 取中间数为基准数
            //int temp = L + (R - L >> 1);
            // 始终以左边为基准数
            //int temp = L;
            Swap(arr, temp, R);
            int[] equalArea = Netherlands(arr, L, R);
            process(arr, L, equalArea[0] - 1);
            process(arr, equalArea[1] + 1, R);
        }
        public static int[] Netherlands(int[] arr, int L, int R)
        {
            if (L > R)
                return new int[] { -1, -1 };
            if (L == R)
                return new int[] { L, R };
            int less = L - 1;
            int more = R;
            int index = L;
            while (index < more)
            {
                if (arr[index] == arr[R])
                    index++;
                else if (arr[index] < arr[R])
                    Swap(arr, index++, ++less);
                else
                    Swap(arr, index, --more);
            }
            Swap(arr, more, R);
            return new int[] { less + 1, more };
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值