常见排序算法--快速排序

常见排序算法–快速排序

算法思想:以数组中第一个点为分界点,数组中比它小的所有结点就排在它的左边,比它大的所有结点排在它的右边;然后将左边数组,右边数组看成一个整体分别按照这种规则进行排序,直达所有结点排序完成。下面我结合实际例子进行解释

假设初始数组为{5,2,7,9,1},第一步取数组第一个点5与数组最右边的数比较,如果最右边的数字比5大,就依次遍历这个最右边数字左边的数,直到找到比这个数小的数,按照上面数组最右边数字1比5小,接下来把数字1复制到数字5的位子,(此时数字1的位置空了)接下来从左到右比较,直到找到一个数(数字7)比数字5大,把数字7复制到空了的位置,然后按照上述规则比较,直到两边比较的数字标号重合,完成一遍排序。

初始状态 5 2 7 9 1
第一步 1 2 7 9
第二步 1 2 9 7
第三步 1 2 5 9 7

这样,小于数字5的全放在了左边,大于数字5的全放在了右边

接下来按照这种规则将数组{1,2,},{9,7}进行排序,

。。。。。。

最后得到排列1,2,5,7,9

左边数组 1 2 右边数组 9 7
排序后 1 2 7
排序后 1 2 7 9

代码如下

//首先以数组的第一个为基本比照点,先与最右边的比较,直到找到一个比它小的数位置j,然后这个小的数就跳到基本点的i位置,接下来以基本点以右进行比较,直到发现比这个基本点的数大的,将这个数跳到j的位置上,然后从j开始。。。直到j和i重合,停止跳动,一趟遍历就做好了
void pai(int a[],int low,int high)
{
    int i=low,j=high,term=a[low];
    if(i<j)
    {
        while(i!=j)
        {
            while(a[j]>term&&j!=i)
            {
                j--;
            }
                if(j!=i)
                    a[i]=a[j];i++;
            while(a[i]<term&&i!=j)
            {
                i++;
            }
            if(j!=i)
                a[j]=a[i];j--;
        }
        a[i]=term;
        //将一趟遍历做好。
        //将剩下来的点按照这种规律进行定点,直到所有点遍历完成
        pai(a,1ow,i-1);
        pai(a,i+1,high);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42373888/article/details/81869486