描述
在昨天的文章中,每次将最左边的元素设为轴,而快速排序法的加速在于轴的选择,在这个例子中,只将轴设定为中间的元素,依这个元素作基准进行比较,这可以增加快速排序法的效率。
代码实现
C++实现:
// Quick2.cpp : 定义控制台应用程序的入口点。
//
#include "StdAfx.h"
#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); // 对右边进行递回
}
}
Java实现:
package com.immunize.Arithmetic;
/**
* 快速排序1.1:调整标准criterion为中间值
*
* @author Mr IMMUNIZE
*
*/
public class QuickForward {
public static void main(String[] args) {
int[] arr = { 1, 3, 5, 2, 22, 13, 6, 78, 65 };
QuickSort1(arr, 0, arr.length - 1);
Print(arr);
}
public static void QuickSort1(int[] number, int left, int right) {
int i, j, crit, tmp;
if (left > right)
return;
crit = number[(left + right) / 2];
i = left - 1;
j = right + 1;
while (true) {
while (number[++i] < crit)
;
while (number[--j] > crit)
;
if (i >= j) {
break;
}
tmp = number[i];
number[i] = number[j];
number[j] = tmp;
}
QuickSort1(number, left, i - 1);
QuickSort1(number, j + 1, right);
}
public static void Print(int[] number) {
for (int i = 0; i < number.length; i++) {
System.out.print(number[i] + " ");
}
System.out.println();
}
}