快排算法--每趟找基准大小在基准两边

  1. 首先设置两个变量i,j。

    分别指向序列的首尾元素。

    快速排序算法实例

    快速排序算法实例

  2. 该例子是以第一个元素为基准,从小到大进行排列,这里的例子中的基准值就是66

    让j从后向前进行查询,直到找到第一个小于66的元素。

    则将最后一个j指向的数23,和i指向的66交换位置。

    然后将i从前向后查询,直到找到第一个大于66的元素76.

    快速排序算法实例

    快速排序算法实例

  3. 将76和66位置互换。

    让j从后向前进行查询,直到找到第一个小于66的元素57

    快速排序算法实例

    快速排序算法实例

  4. 将57和66交换位置。

    快速排序算法实例

    快速排序算法实例

  5. 然后将i从前向后查询,直到找到第一个大于66的元素81.

    快速排序算法实例

  6. 将81和66交换位置。

    让j从后向前进行查询,直到找到第一个小于66的元素26

    快速排序算法实例

  7. 将26和66交换位置。

    此时i,j都同时指向了目标元素66.

    查找停止。

  8. 所得到的序列就是第一趟排序的序列,使得左边的数都小于基准数66,右边的数都大于基准数66,左边和右边分别作上述的相同的排序操作。

    快速排序算法实例

  9. 附上一段代码:

#include <stdio.h>
#include <stdlib.h>

/*
快速排序算法学习
*/

void swap(int *a, int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

void quickSort(int arr[] ,int i, int j)
{
    int arrBase;

    int tempi = i,
        tempj = j;

    //对于这种递归的函数,内部必须要有一个函数返回的条件
    if(tempi >= tempj)
        return;

    //拷贝一个基准值作为后面比较的参数
    arrBase = arr[i];
    while(i < j)
    {
        while(i < j && arr[j] > arrBase)
            j--;
        if(i < j)
        {
            swap(&arr[i], &arr[j]);
            i++;
        }

        while(i < j && arr[i] < arrBase)
            i++;
        if(i < j)
        {
            swap(&arr[i], &arr[j]);
            j--;
        }
    }
    arr[i] = arrBase;

    //分治方法进行递归
    quickSort(arr,tempi,i-1);
    quickSort(arr,i+1,tempj);
}

int main()
{
    int myArr[] = {12,13,15,20,0,-1,-10,100};

    int arrLength = sizeof(myArr)/sizeof(int);
    quickSort(myArr,0,arrLength-1);
    int i = 0;
    for(; i<arrLength; i++)
        printf("%5d",myArr[i]);
    printf("\n");
    return 0;
}

上述代码算法实现中有一定的优化,如将a[i]作为定子比较时发现,a[i]>a[j],i++;

经验证发现arrBase不是必要的;

代码在做while 循环时写法过于啰嗦,逻辑不清。

优化后的代码:

#include <stdio.h>
#include <stdlib.h>
 
/*
快速排序算法
*/
 
void swap(int *a, int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
 
void quickSort(int arr[] ,int i, int j)
{
    int tempi = i,
        tempj = j;
    //对于这种递归的函数,内部必须要有一个函数返回的条件
    if(tempi >= tempj)
        return;
 
    while(i < j)
    {
        while(i < j)
        {
            if(arr[i] > arr[j])
            {
                swap(&arr[i], &arr[j]);
                break;
            }
            j--;
        }
            
        while(i < j)
        {
            if(arr[i] > arr[j])
            {
                swap(&arr[i], &arr[j]);
                break;
            }
            i++;
        }
    }
    //分治方法进行递归
    quickSort(arr,tempi,i-1);
    quickSort(arr,i+1,tempj);
}
 
int main()
{
    int myArr[] = {12,13,15,20,0,-1,-10,100,50,3,8};
 
    int arrLength = sizeof(myArr)/sizeof(int);
    quickSort(myArr,0,arrLength-1);
    int i = 0;
    for(; i<arrLength; i++)
        printf("%5d",myArr[i]);
    printf("\n");
    return 0;
}

  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值