前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++经典算法题-快速排序法(二)

C++经典算法题-快速排序法(二)

作者头像
cwl_java
发布2020-02-13 23:21:18
3710
发布2020-02-13 23:21:18
举报
文章被收录于专栏:cwl_Javacwl_Java

38.Algorithm Gossip: 快速排序法(二)

说明

在快速排序法(一)中,每次将最左边的元素设为轴,而之前曾经说过,快速排序法的 加速在于轴的选择,在这个例子中,只将轴设定为中间的元素,依这个元素作基准进行比较, 这可以增加快速排序法的效率。

解法

在这个例子中,取中间的元素s作比较,同样的先得右找比s大的索引 i,然后找比s小的 索引 j,只要两边的索引还没有交会,就交换 i 与 j 的元素值,这次不用再进行轴的交换了, 因为在寻找交换的过程中,轴位置的元素也会参与交换的动作,例如:

代码语言:javascript
复制
41	24	76	11	45	64	21	69	19	36

首先left为0,right为9,(left+right)/2 = 4(取整数的商),所以轴为索引4的位置,比较的元素是 45,您往右找比45大的,往左找比45小的进行交换:

代码语言:javascript
复制
41	24	76*	11	[45]	64	21	69	19	*36

41	24	36	11	45*	64	21	69	19*	76
41	24	36	11	19	64*	21*	69	45	76
[41	24	36	11	19	21]	[64	69	45	76]

完成以上之后,再初别对左边括号与右边括号的部份进行递回,如此就可以完成排序的目的。

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h> 
#include <time.h> 
#define MAX 10

#define SWAP(x,y) {int t; t = x; x = y; y = t;} void quicksort(int[], int, int);
    int main(void) {
        int number[MAX] = {0}; int i, num; srand(time(NULL)); printf("排序前:");
        for(i = 0; i < MAX; i++) {
            number[i] = rand() % 100; printf("%d ", number[i]);
        }

        quicksort(number, 0, MAX-1); printf("\n排序后:");
        for(i = 0; i < MAX; i++) printf("%d ", number[i]);

        printf("\n"); return 0;
    }

    void quicksort(int number[], int left, int right) { int i, j, s;
        if(left < right) {
            s = number[(left+right)/2]; i = left - 1;
            j = right + 1;

            while(1) {
                while(number[++i] < s) ;		// 向右找while(number[--j] > s) ;	// 向左找if(i >= j)
                break; SWAP(number[i], number[j]);
            }

            quicksort(number, left, i-1);	// 对左边进行递回
            quicksort(number, j+1, right);	// 对右边进行递回
        }

    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-01-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 38.Algorithm Gossip: 快速排序法(二)
    • 说明
      • 解法
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档