您的位置:首页 > 编程语言 > C语言/C++

快速排序演示

2015-07-06 19:21 375 查看
#include<iostream>
#define CUTOFF 10  // 定义快速排序的数组规模下届

// 交换两个整数
void swap(int *fir, int *sec) {
int temp = 0;
temp = *fir;
*fir = *sec;
*sec = temp;
}

// 插入排序算法
void InsertionSort(int A[], int n ) {
int j, p;
int tmp;

for(p = 1; p < n; p++ ) {
tmp = A[ p ];
for( j = p; j > 0 && A[ j - 1 ] > tmp; j-- )
A[ j ] = A[ j - 1 ];
A[ j ] = tmp;
}
}

// 三数中值分割
int Median3(int A[], int left, int right) {
// 计算中间位置
int center = (left + right) / 2;

if( A[ left ] > A[ center ] )
swap( &A[ left ], &A[ center ] );
if( A[ left ] > A[ right ] )
swap( &A[ left ], &A[ right ] );
if( A[ center ] > A[ right ] )
swap( &A[ center ], &A[ right ] );

/* 不变等式: A[left] <= A[center] <= A[right] */

swap( &A[ center ], &A[ right - 1 ] );  // 隐藏枢纽元
return A[right - 1];
}

// 快速排序算法
void Qsort(int A[], int left, int right) {
int i, j;
// 枢纽元
int pivot;

if( left + CUTOFF <= right ) {
pivot = Median3( A, left, right );
// 初始化i,j的位置
i = left; j = right - 1;
for( ; ; ) {
while( A[ ++i ] < pivot ) {}
while( A[ --j ] > pivot ) {}
if( i < j )
swap( &A[ i ], &A[ j ]);
else
break;
}
// 将枢纽元与i所指向的元素交换
swap( &A[ i ], &A[ right - 1 ]);

// 以i为分界线,分别对左右两端递归的进行快速排序
Qsort( A, left, i - 1);
Qsort( A, i + 1, right);
}
else  // 在该数组上做一次插入排序
InsertionSort(A + left, right - left + 1);
}

// 打印数组
void printArray(int A[], int len) {
int length = len;
int index;

for(index = 0; index <= len - 1; index++) {
printf("%d ", A[index]);
}
}

int main(){
// 函数声明
void swap(int *fir, int *sec);
void InsertionSort(int A[], int n );
int Median3(int A[], int left, int right);
void Qsort(int A[], int left, int right);
void printArray(int A[], int len);

int A[15] = {2,5,1,7,6,19,30,9,4,8,21,11,18,22,47};
printf("快速排序之前: \n");
printArray(A, 15);

Qsort(A, 0, 14);

printf("\n");
printf("快速排序之后: \n");
printArray(A, 15);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 快速排序