快速排序

#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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值