#include<iostream>
#define ElementType int
#define Cutoff 10
using namespace std;
void Swap(ElementType *i,ElementType *j){
*i = *i+*j;
*j = *i-*j;
*i = *i-*j;
}
void InsertionSort( ElementType A[], int N )
{ /* 插入排序 */
int P, i;
ElementType Tmp;
for ( P=1; P<N; P++ ) {
Tmp = A[P]; /* 取出未排序序列中的第一个元素*/
for ( i=P; i>0 && A[i-1]>Tmp; i-- )
A[i] = A[i-1]; /*依次与已排序序列中元素比较并右移*/
A[i] = Tmp; /* 放进合适的位置 */
}
}
ElementType Median3( ElementType 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] ); /* 将基准Pivot藏到右边*/
/* 只需要考虑A[Left+1] … A[Right-2] */
return A[Right-1]; /* 返回基准Pivot */
}
void Qsort( ElementType A[], int Left, int Right )
{ /* 核心递归函数 */
int Pivot, Low, High;
if ( Cutoff <= Right-Left ) { /* 如果序列元素充分多,进入快排 */
Pivot = Median3( A, Left, Right ); /* 选基准 */
Low = Left; High = Right-1;
while (1) { /*将序列中比基准小的移到基准左边,大的移到右边*/
while ( A[++Low] < Pivot ) ;
while ( A[--High] > Pivot ) ;
if ( Low < High ) Swap( &A[Low], &A[High] );
else break;
}
Swap( &A[Low], &A[Right-1] ); /* 将基准换到正确的位置 */
Qsort( A, Left, Low-1 ); /* 递归解决左边 */
Qsort( A, Low+1, Right ); /* 递归解决右边 */
}
else InsertionSort( A+Left, Right-Left+1 ); /* 元素太少,用简单排序 */
}
void QuickSort( ElementType A[], int N )
{ /* 统一接口 */
Qsort( A, 0, N-1 );
}
int main(int argc, char const *argv[])
{
int a[] = {21,4,12,41,234,12,3,4,12,4,12,34,12,34,3,5,34,6,45,7,56,8,569,67,978,0,67,8967,8,4576,35,643,5,43,7,6,8,75,89,86,9,56,7,3};
QuickSort(a,sizeof(a)/sizeof(a[0]));
for(int i:a){
cout<<i<<endl;
}
return 0;
}
快速排序(快排+插入排序版)
最新推荐文章于 2023-01-07 15:17:57 发布
这篇博客详细介绍了快速排序和插入排序两种经典算法的实现过程。通过C++代码展示了快速排序的核心递归函数`Qsort`和插入排序`InsertionSort`,并提供了选择中位数的`Median3`辅助函数。博主还提供了一个包含多个整数的数组示例,调用`QuickSort`进行排序,并打印排序后的结果,展示了这两种排序算法的实际应用。
摘要由CSDN通过智能技术生成