您的位置:首页 > 其它

23 快速排序2

2014-10-20 16:27 225 查看
说明在快速排序法(一)中,每次将最左边的元素设为轴,而之前曾经说过,快速排序法的加速在于轴的选择,在这个例子中,只将轴设定为中间的元素,依这个元素作基准进行比较, 这可以增加快速排序法的效率。
解法在这个例子中,取中间的元素s作比较,同样的先得右找比s大的索引 i,然后找比s小的索引 j ,只要两边的索引还没有交会,就交换 i 与 j 的元素值,这次不用再进行轴的交换了, 因为在寻找交换的过程中,轴位置的元素也会参与交换的动作,例如:
41 24 76 11 45 64 21 69 19 36
首先left为0 ,right为9,(left+right)/2 = 4(取整数的商) ,所以轴为索4引的位置,比较的元素是45,您往右找比45大的,往左找比45小的进行交换:

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]
完成以上之后,再初别对左边括号与右边括号的部份进行递回,如此就可以完成排序的目的。
***************程序************

#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); // 对右边进行递回

}

}

*************END*************

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: