【快速排序二】
/* 快速排序法二 说明: 在快速排序法(一)中,每次将最左边的元素设为轴,而之前曾经说过,快速排序法的加速在于轴的选择,在这个例子中,只将轴设 定为中间的元素,依这个元素作基准进行比较,这可以增加快速排序法的效率。 解法; 在这个例子中,取中间的元素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> #include<string.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, flag = 1; char ch; srand(time(NULL)); while(flag){ 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"); printf("是否继续?(y or Y):"); scanf("%c", &ch); getchar(); if(ch != 'y' && ch != 'Y'){ flag = 0; } } 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); //对右边进行递回 } }
运行结果:
转载本博请联系作者! 如有问题请在评论区评论或者发邮件:@libras