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