标签:summary 并且 分享 int() int 第一个 bsp 指针 name
哪里都有讲快速排序的,啥的,我也看了很多篇别人写的文章。但是好多文章里面都是直接就说拿两个i,j变量,就开始比较了。
快速排序,简单的说就是,先确定一个基准,然后就把比这个基准大的放到一边,比这个基准小的放到一边。放到一边的时候,是不管它是有序还是无序的。接下来在把之前的操作重复一下,其实就是一个递归的过程。
为什么要定义两个变量进行快速排序呢?
其实是这样的,快速排序,为啥叫快速排序呢,快在哪里,快在它减少了交换次数,还有一个原因就是快速排序是在快速排序是不用新开内存的,可以减少内存的使用。它就是在原地完成排序的。可能这样讲,你还是不明白,那我们来进行假设,如果只定义一个变量i的话呢,然后进行比较大小,那不就成了冒泡排序了吗。刚刚还说了快速排序是在原地完成排序的,不需要另外开辟空间资源的。你单独定义一个变量显然是不能实现的。
为啥要定义如果基准数量在这边,那么就要先从另外一边开始扫描呢。
先想想如果是放在同一边的话,那不就成了个冒泡排序吗。
那么接下来我就分享下,我理解的快速排序给大家,请大家多多指教。
首先,比如我们拿到一个数组 int [] arr=new int(){1,3,5,2,4,8,6,7}。按照我们刚刚的做法,
class Program { static void Main(string[] args) { var arr = new int[] { 46, 12, 34, 56, 18, 100, 23, 54 }; quick_sort(arr, 0, arr.Length - 1); foreach (var i in arr) { Console.WriteLine(i); } Console.ReadKey(); } static void quick_sort(int[] s, int l, int r) { //递归调用 if (l < r) { int i = AdjustArray(s, l, r);//先成挖坑填数法调整s[] quick_sort(s, l, i - 1); // 递归调用 quick_sort(s, i + 1, r); } } /// <summary> /// 按照基准数进行调整数组 /// </summary> /// <param name="arr"></param> /// <param name="left"></param> /// <param name="right"></param> /// <returns></returns> static int AdjustArray(int[] arr, int left, int right) { int temp = arr[left]; //假设第一个为基准树 while (left < right) { //当左边小于右边,并且基准数小于右边的那个数。 if (left < right && temp <= arr[right]) { right--; //把指针像前面移动 } //当左边小于右边,并且基准数大于右边的那个数。 if (left < right && temp >= arr[right]) { arr[left] = arr[right]; //说明右边的数比基准数小,那要放到左边来 left++;//然后接下来就是左边移动一下了++ } //当左边小于右边,并且基准数大于左边的那个数。 if (left < right && temp >= arr[left]) { left++; } //当左边小于右边,并且基准数小于左边的那个数。 if (left < right && temp <= arr[left]) { arr[right] = arr[left]; right--; } } arr[left] = temp; return left; } }
标签:summary 并且 分享 int() int 第一个 bsp 指针 name
原文地址:http://www.cnblogs.com/gdouzz/p/6731153.html