描述
昨天的文章提到了參考點的選擇是快速排序法的效率關鍵之一,在這邊的快速排序法的軸選擇方式更加快了快速排序法的效率。
代碼實現
C++實現:
// QuickPartition.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;}
int partition(int[], int, int);
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;
}
int partition(int number[], int left, int right) {
int i, j, s;
s = number[right];
i = left - 1;
for(j = left; j < right; j++) {
if(number[j] <= s) {
i++;
SWAP(number[i], number[j]);
}
}
SWAP(number[i+1], number[right]);
return i+1;
}
void quicksort(int number[], int left, int right) {
int q;
if(left < right) {
q = partition(number, left, right);
quicksort(number, left, q-1);
quicksort(number, q+1, right);
}
}
Java實現:
package com.immunize.Arithmetic;
/**
* Quick排序1.2
*
* @author Mr IMMUNIZE
*
*/
public class QuickPartition {
public static void main(String[] args) {
int[] arr = { 1, 3, 5, 2, 22, 13, 6, 78, 65 };
QuickSort2(arr, 0, arr.length - 1);
Print(arr);
}
public static int partition(int[] number, int left, int right) {
int i, j, s, tmp;
s = number[right];
i = left - 1;
for (j = left; j < right; j++)
if (number[j] <= number[right]) {
i++;
tmp = number[i];
number[i] = number[j];
number[j] = tmp;
}
tmp = number[i + 1];
number[i + 1] = number[right];
number[right] = tmp;
return i + 1;
}
public static void QuickSort2(int[] number, int left, int right) {
int q;
if (left < right) {
q = partition(number, left, right);
QuickSort2(number, left, q - 1);
QuickSort2(number, q + 1, right);
}
}
public static void Print(int[] number) {
for (int i = 0; i < number.length; i++) {
System.out.print(number[i] + " ");
}
System.out.println();
}
}