快速排序法(二)

来源:互联网 发布:java面向对象还是过程 编辑:程序博客网 时间:2024/06/04 23:33

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

解法
在这个例子中,取中间的元素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]

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

实例

Java 写法

public class QuickSort {    public static void sort(int[] number) {        sort(number, 0, number.length-1);    }        private static void sort(int[] number,                              int left, int right) {        if(left < right) {             int s = number[(left+right)/2];             int i = left - 1;             int j = right + 1;             while(true) {                 // 向右找                while(number[++i] < s) ;                // 向左找                while(number[--j] > s) ;                 if(i >= j)                     break;                 swap(number, i, j);             }             sort(number, left, i-1);   // 对左边进行递回             sort(number, j+1, right);  // 对右边进行递回         }    }        private static void swap(int[] number, int i, int j) {        int t;         t = number[i];         number[i] = number[j];         number[j] = t;    }} 


C写法

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


 

 


 

2 0
原创粉丝点击