码迷,mamicode.com
首页 > 编程语言 > 详细

排序算法——快速排序

时间:2017-08-05 06:31:36      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:strong   结果   adjust   快速排序   tar   --   分治思想   while   算法   

算法思想:

  分治+挖坑填数

  分治思想

    将原问题分解成若干规模更小但是结构和原问题相同的子问题。递归求解子问题,然后解出原问题。

  快排算法思想

    ①选择数组中第一个数作为基数,然后设置下标i=first,j=last

    ②(下标j–)从数组后面找出比第一个数小的数调换到前面

    ③然后(下标i++)从数组前面找出比基数大的数调换到后面

    ④如此循环②-③步,直到i=j

    结果为以基数分界,左边的数比全部比基数小,右边的数比基数大。结束这次排序。

    然后,下次分别排序[first,i-1]和[i+1,last]。这样就将原问题划分成两个与原问题相同的子问题,再次对这两个区间进行快速排序。

 


算法代码实现:

 

//分治
void QuickSort(int a[],int first,int last)
{
    if(first < last)
    {
        int i = AdjustArray(a,first,last);//以基数分界,对基数左边快排,对基数右边快排
        QuickSort(a,first,i-1);
        QuickSort(a,i+1,last);
    }
}

//挖坑填数的代码
int AdjustArray(int a[],int first,int last)
{
    int i = first,j = last;
    int m = a[first];//以第一个数为基数

    while(i<j)
    {
        while(i<j && a[j] >= m)//从后往前找小于基数的数
            j--;
        if(i<j)
        {
            a[i] = a[j];//将a[j]填到a[i],a[j]变成一个坑
            i++;
        }

        while(i<j && a[i] < m)//从前往后找比基数大的数
            i++;
        if(i<j)
        {
            a[j] = a[i];//将a[i]填到a[j],a[i]变成一个坑
            j--;
        }
    }
    a[i] = m;//退出时,i=j,将基数填入坑中
    return i;
}

 

 

 

 

  

排序算法——快速排序

标签:strong   结果   adjust   快速排序   tar   --   分治思想   while   算法   

原文地址:http://www.cnblogs.com/myworld7/p/7288204.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!