快速排序qsort数据结构,c/c++/c#

快速排序简称拔萝卜排序(以升序为例)。先选定一个萝卜把他拔出来(以第一个坑为例),然后从最后一个坑开始看,那个萝卜比拔出来的小,就把他拔出来放到没萝卜的那个坑,然后又从第一个开始找比它大的填到那个坑。。。。第一个拔出来的萝卜等到左边的萝卜都比右边的大他就放进相遇的那个坑,再并发左边萝卜和右边萝卜。

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

namespace QuickSort
{
    class Program
    {
        //数组是我随便打的
        //至于语言稍作修改都可运行
        public static int[] arr = { 123, 3, 5, 3, 132, 1, 565656, 735, 5, 5, 9999, 5555, 35, 35, 35, 35, 3, 135, 35, 2625256, 333, 356356356, 353565123, 357565635, 1213 };
        static void Main(string[] args)
        {
            adjust(0,arr,arr.Length-1);
            foreach (var item in arr)
                Console.Write(item+" ");
            Console.WriteLine("");
            Myqsort2(0, arr, arr.Length - 1);
            foreach (var item in arr)
                Console.Write(item + " ");
        }
        public static void adjust(int l,int[] arr,int r)
            //这里是第n次排序好了之后并发左边和右边
        {
            if (l < r)
            {
                int i = Myqsort(l, arr, r);
                adjust(l, arr, i - 1);
                adjust(i + 1, arr, r);
            }
        }
        public static int Myqsort(int l, int[] arr,int r)
        {
            
            int le = l, ri = r;
            int x = arr[l];
            while(le<ri)//左边和右边相遇就停止,代表本次已经排好了
            {
                while(ri>le)//先从后面后开始找,找到就置换然后跳出
                {
                    if(x>arr[ri])
                    {
                        arr[le] = arr[ri];
                        break;
                    }
                    ri--;
                }
                while (ri > le)//再从前面找找到就置换然后跳出
                {
                    if(x<arr[le])
                    {
                        arr[ri] = arr[le];
                        break;
                    }
                    le++;
                }
            }
            arr[ri] = x;//最后把萝卜放入到那个坑里面
            return ri;
        }


        public static void Myqsort2(int l, int[] arr,int r)
        {
            //这里是两个合一的版本
            if (l < r)
            {
                int le = l, ri = r;
                int x = arr[l];
                while (le < ri)
                {
                    while (ri > le)
                    {
                        if (x > arr[ri])
                        {
                            arr[le] = arr[ri];
                            break;
                        }
                        ri--;
                    }
                    while (ri > le)
                    {
                        if (x < arr[le])
                        {
                            arr[ri] = arr[le];
                            break;
                        }
                        le++;
                    }
                }
                arr[ri] = x;
                int i= ri;
                Myqsort2(l, arr, i - 1);
                Myqsort2(i + 1, arr, r);
            }
            
        }
    }
}

贴出学习网址芜湖起飞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值