首页 > 其他 > 详细

【排序算法】排序算法之快速排序

时间:2014-02-25 23:44:01      阅读:612      评论:0      收藏:0      [点我收藏+]

一、快速排序的思想

  上一篇写了冒泡排序,这一篇就讲讲我对快速排序的理解吧。快速排序,如何个快速法,简而言之就是取第一个数为基准数,将比这个基准数小的都放在左边,大的都放在右边,基准数在中间,第一轮之后,再对左边块中进行刚刚的排序换位,直到左边的都排序都正确了,再对右边的块进行排序换位。如此看来,其实就是一分为二、二分为4,不断分隔,不断调整的过程。

  下面以一个具体数组,来分析快速排序的过程。

0 1 2 3 4 5 6 7
25 73 66 10 37 84 5 17

   首先咱们取第一个数25为基准数,由于把基准数提出来了,那么intarray[0]就空出来了。flag=25。left=0,right=7.

  首先右→左(7→0),看又那个数比flag小,right--过程中,当right=7时,发现intarray[7]<flag,则用intarray[7]来填充intarray[0]的空缺,intarray[0]=intarray[7].

  left=0,right=7

0 1 2 3 4 5 6 7
17 73 66 10 37 84 5  空位

  如此intarray[7]的位置空下来了。左→右(0→7),left++,寻找比flag大的数据,当left=1时,找到了比flag大的数据,intarray[1]可以填充intarray[7]的空位了。

  left=1,right=7

0 1 2 3 4 5 6 7
17   空位 66 10 37 84 5 73

     继续右→左(7→1)找比25小的数,right--,right=6时,intarray[6]可以填充intarray[1]的空位了。

     left=1,right=6

0 1 2 3 4 5 6 7
17  5 66 10 37 84  空位  

   继续左→右(1→6),left++,寻找比25大的数,left=2时,找到。intarray[2]可以填充intarray[6]的空位了。

  left=2,right=6

0 1 2 3 4 5 6 7
17  5 空位 10 37 84  66 73

  从右至左(6-2),right--,intarray[3]可以填充intarray[2]的空位了。

     left=2,right=3

0 1 2 3 4 5 6 7
17  5 10 空位 37 84  66 73

  从左至右(2-3),left++,在下标为3的地方相遇了,则intarray[3]的空位就是flag了。

0 1 2 3 4 5 6 7
17  5 10 25 37 84  66 73

    至此,以25为基准的第一轮排序结束,现在比25大的都在左边大的都在右边,黄色下标的为一个新的数组,蓝色下表的为另一个数组。

    再次重复第一轮的排序,直到数组数组不可分割,只有一个数为止,至此,排序完成。

 

二、快速排序代码

  快速排序的思想咱们都领会了,那么代码实现就简单了。

  

bubuko.com,布布扣
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace kuaisu
{
   class Program
    {
        static void Main(string[] args)
        {
            int[] intarrays = { 25, 73, 66, 10, 37, 84, 5, 17 };
            quick_sort(intarrays, 0, 7);
            foreach (int item in intarrays)
            {
                Console.Write(item + "   ");
            }
            Console.ReadKey();
        }
        static void quick_sort(int[] intarray, int left, int right)
        {
            if (left < right)
            {
                int i = left, j = right, flag = intarray[left];
                while (i < j)
                {
                    while (i < j && intarray[j] >= flag)
                    {
                        j--;//从右向左找小于基准数的值
                    }
                    if (i < j)
                    {
                        intarray[i++] = intarray[j];//将这个数填充到空缺的值中
                    }
                    while (i < j && intarray[i] < flag)
                    {
                        i++;//从左向右找大于基准数的值
                    }
                    if (i < j)
                    {
                        intarray[j--] = intarray[i];
                    }

                    intarray[i] = flag;
                    quick_sort(intarray, left, i - 1); // 递归调用
                    quick_sort(intarray, i + 1, right);
                }
            }
        }
    }
}
bubuko.com,布布扣

打印结果如图:
bubuko.com,布布扣

【排序算法】排序算法之快速排序

原文:http://www.cnblogs.com/janneystory/p/3566310.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!