快速排序

快速排序

算法思想:

快速排序的算法思想:选区一个关键字,通过一趟排序将一组数据划分为两部分,其中一部分比所选取的关键字小(放到关键字左边),另一部分比所选取的关键字大(放到关键字右边)。利用分治的思想对其中每一个部分在进行一趟这样的排序,直至达到最终有序。

实现原理:

1、设置两个变量low=0,high=n-1

2、进行第一趟划分,将基准值放到正确的位置,是的小的元素在左边,大的元素在右边:

      1)选取第一个元素作为基准值。base=array[low]

      2)  因为默认选取第一个元素作为基准值,因此应该先从后向前进行搜索,通过high--,向前移动找到第一个小于base的元素array[high],将这个元素array[high]赋给array[low]。(循环条件base<=array[high],循环结束时,base>array[high])

      3)  此时开始从前向后搜索,通过low++,向后移动找到第一个大于base的元素array[low],将这元素array[low]赋给array[high],即array[high]=array[low],(循环条件是array[low]<=base,循环结束时base<array[low])

      4)  循环2)3)步骤直至low=high时,该位置就是基准位置。

      5)将基准值base放到基准位置。

3、利用分治思想对基准两边进行同样的划分策略。

举例演示:

例如随机给出一组数据:array[8]={ 5 , 7 , 2 , 4 , 9 , 1 , 3 , 4 },选取第一个元素5作为基准值base=5。做需要先从后向前比较

1、进行第一趟划分:base=5

      5 7 2 4 9 1 3 4    low=0,high=7,base>array[7],交换。

      4 7 2 4 9 1 3 5    low=0,high=7,base>array[low],不交换,low++。low=1,比较,交换。

      4 5 2 4 9 1 3 7    low=1,high=7,base<array[high],不交换,high--。low=1,high=6,5>3,交换。

      4 3 2 4 9 1 5 7    low=1,high=6,base>array[low],不交换,low++。low=2,low++。low=3,不换,low++,low=4,交换。

      4 3 2 4 5 1 9 7    low=4,high=6,base<array[high],不换,high--。high=5,交换。

      4 3 2 4 1 5 7 9    low=4,high=5,不换,low++。low=high=5。退出循环。

代码实现:

#include<iostream>
#include<cstdlib>
using namespace std;

int partition(int array[], int i, int j)
{
    int base = array[i];//选取第一个元素为基准值 
    while(i < j)
    {
        //因为基准值是第一个元素,所以应该从最后一个元素开始比较。
        while(i < j && base <= array[j])
        {
            j--;
        } 
        //当找到一个比基准值小的元素时,将这个元素与基准值“交换”。 
        if(i < j)
        {
            array[i] = array[j];
        }
        //开始从前边找一个比基准值大的元素 
        while(i < j && array[i] <= base)
        {
            i++;
        }
        //找到之后,将这个元素放后,“交换” 
        if(i < j)
        {
            array[j] = array[i]; 
        }
    }
    /*
    上边交换是一个假的交换,因为基准值最终都要回到他应该取得位置,
    当退出循环时,i=j,此时,该位置就是基准值应该所在的正确位置。 
    */
    //把基准值放到正确的位置
    array[i] = base;
    //同时需要返回i值,利用分治思想,可以利用i值,对i左边的部分分别进行同样的划分。 
    return i;
}

void QuickSort(int array[] , int low , int high)
{
    //当元素只有一个时,不需要排序,作为递归的出口。
    if(low < high)
    {
        int temp = partition(array, low, high);
        
        QuickSort(array, low, temp - 1);
        QuickSort(array, temp + 1, high);
    } 
}

void show(int array[], int size)
{
    for(int i = 0; i < size; i++)
    {
        cout << array[i] << " ";
    }
    cout << "\n"; 
}
int main()
{
    int array[] = {3,6,1,4,7,3,5,2,9,0}; 
    int size = sizeof(array) / sizeof(int);
    cout << size << endl;
    QuickSort(array, 0, size-1);
    show(array, size);
    
    size = 20;
    int arr_1[20] = {0};
    for(int i = 0; i < 10; i++)
    {
        for(int j = 0; j < size; j++)
        {
            arr_1[j] = rand() % 1000;//随机生成数组 
        }
        //排序前的数组
        cout << "排序前的数组:"; 
        show(arr_1, size);
        QuickSort(arr_1, 0, size-1);
        cout << "排序后的数组:";
        show(arr_1, size);
    }
    
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值