【第22期】观点:IT 行业加班,到底有没有价值?

快速排序演示

原创 2015年07月06日 19:21:22
#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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

【从零学习经典算法系列】分治策略实例——快速排序(QuickSort)

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n个项目要O(nlogn)次比较。在最坏状况下则需要O(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他O(nlogn)算...

用java实现快速排序算法

  <h1 class="title_txt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; pad...
  • ictch
  • ictch
  • 2011-04-13 21:52
  • 604

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

算法导论-------快速排序QuickSort

目录: 一、快速排序思想介绍 二、实现的三步骤(分解、子问题求解、合并) 三、C代码实现 3.1 快速排序双向扫描法(一) 3.2 partition函数双向扫描法(二) 3.3 part...

快速排序法2图形演示

package com.wfy; import java.awt.Color;import java.awt.Frame;import java.awt.Graphics;import java.awt.event.WindowAdapter;import java.awt.event.Window...
  • iwfy
  • iwfy
  • 2008-11-06 22:20
  • 4012

快速排序算法

快速排序算法 编辑 快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)