排序总结---快排

//
// Created by liyuanshuo on 2017/3/17.
//

#include "quick_sort.h"

/*
 *快速排序:
 * 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。
 * 在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快
 * 因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来
 * 且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性。
 *
 *
 * 基本思想:
 * 1.选择一个基准元素,通常选择第一个或者最后一个
 * 2.通过一趟排序将待排序的序列的记录分割成独立的两个部分,其中一部分记录的元素的值都比基准元素要小
 * 另一部分记录的元素的值都比基准元素要大
 * 3.此时基准元素恰好在其排好序后的正确位置
 * 4.然后分别对这两个独立的记录使用同样的方法继续进行排序,直到整个序列有序
 */

void swap( int &a, int &b )
{
	int tmp = a;
	a = b;
	b = tmp;
}

int partition( int a[], int low, int high )
{
	int privot_key = a[low];
	int ll = low, hh = high;
	while ( ll < hh )
	{
		while ( ll < hh && a[hh] >= privot_key )
		{
			--hh;
		}
		swap (a[ll], a[hh]);
		while ( ll < hh && a[ll] <= privot_key )
			++ll;
		swap (a[ll], a[hh]);
	}
	return ll;
}

void quick_sort_1( int a[], int beg, int end )
{
	int low = beg;
	int high = end;
	if( low < high )
	{
		int privot  = partition (a, low, high );
		quick_sort_1 (a, low, privot-1);
		quick_sort_1 (a, privot+1, high);
	}
}


/*
 * 快速排序的改进:
 *
 * 在本改进算法中,只对长度大于k的子序列递归调用快速排序,让原序列基本有序,然后再对整个基本有序序列用插入排序算法排序
 * 实践证明,改进后的算法时间复杂度有所降低,且当k取值为 8 左右时,改进算法的性能最佳
 *
 */

void quick_sort_improve( int a[], int beg, int end, int k )
{
	if( end - beg > k )
	{
		int pivot = partition ( a, beg, end);
		quick_sort_improve (a, beg, pivot-1, k);
		quick_sort_improve (a, pivot+1, end, k);
	}
}

void quick_sort_2( int a[], int n, int k )
{
	quick_sort_improve (a, 0, n, k);
	for (int i = 1; i <= n; ++i)
	{
		int tmp = a[i];
		int j = i -1;
		while ( tmp < a[j] )
		{
			a[j+1] = a[j];
			j--;
		}
		a[j+1] = tmp;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值