部分排序算法的练习。
#include <iostream>
#include <cstring>
using namespace std;
#define N 100
int elem[N];//待排序数组
int n;//实际元素个数
//Input
void Input()
{
cin >> n;
for( int i = 0 ; i < n ; i++ )
{
cin >> elem[i];
}
}
//Output
void Output()
{
for( int i = 0 ; i < n ; i++ )
{
cout << elem[i] << " ";
}
cout << endl;
}
//交换元素
void swap(int *p,int *q)
{
int t;
t = *p;
*p = *q;
*q = t;
}
//冒泡排序
void BubbleSort(int elem[],int n)
{
for(int i = 0 ; i < n-1 ; i++ )
{
for(int j = n-1 ; j > i ; j-- )
{
if( elem[j] < elem[j-1] )
{
swap( &elem[j] , &elem[j-1] );
}
}
}
}
//插入排序
void InsertSort(int elem[],int n)
{
for( int i = 1 , j ; i < n ; i++ )
{
int tmpElem = elem[i];
for( j = i-1 ; j >= 0 && elem[j] > tmpElem ; j-- )
{
elem[j+1] = elem[j];
}
elem[j+1] = tmpElem;
}
}
//选择排序
void SelectSort(int elem[],int n)
{
for( int i = 0 ; i < n-1; i++ )
{
int min = elem[i];
int minIndex = i;
for( int j = i+1 ; j < n ; j++ )
{
if( elem[j] < min )
{
min = elem[j];
minIndex = j;
}
}
elem[minIndex] = elem[i];
elem[i] = min;
}
}
//合并排序
void Merge(int elem[],int p,int q,int r)
{
int i,j,k;
int len1 = q-p+1;
int len2 = r-q;
int L[N];
int R[N];;
for( i = 0 ; i < len1 ; i++ )
L[i] = elem[ p + i ];
for( j = 0 ; j < len2 ; j++ )
R[j] = elem [ q + j + 1 ];
for( i = 0 , j = 0 , k = p ; i < len1 && j < len2 ; k++ )
{
if( L[i] <= R[j] )
{
elem[k] = L[i];
i = i+1;
}
else
{
elem[k] = R[j];
j = j+1;
}
}
while( i < len1 )
{
elem[k] = L[i];
i = i+1;
k = k+1;
}
while( j < len2 )
{
elem[k] = R[j];
j = j+1;
k = k+1;
}
}
void MergeSort(int elem[],int p,int r)
{
if( p < r )
{
int q = ( p + r ) / 2;
MergeSort( elem , p , q );
MergeSort( elem , q+1, r );
Merge( elem , p , q , r );
}
}
//快速排序
int Partition(int elem[],int p,int r)
{
int x = elem[r];
int i = p - 1;
for( int j = p ; j <= r-1 ; j++ )//划分出三个集合 1.{ 下标 p to i | 小于x集合 } 2.{ 下标 j to r-1 | 大于x集合 } 3.{ x | 中值元素 }
{
if( elem[j] <= x )
{
i = i + 1;
swap( &elem[i] , &elem[j] );
}
}
swap( &elem[i+1] , &elem[r] );
return i+1;
}
void QuickSort(int elem[],int p,int r)
{
if( p < r )
{
int q = Partition( elem , p , r );
QuickSort( elem , p , q-1 );
QuickSort( elem , q , r );
}
}
//递归版的插入排序
void Insert(int elem[],int start,int len,int val)
{
int i;
for( i = len ; i >= 0 && elem[i] > val ; i-- )
{
elem[i+1] = elem[i];
}
elem[i+1] = val;
}
void CurInsertSort(int elem[],int start,int n)
{
if( n >= 1 )
{
CurInsertSort( elem , 0 , n-1 );//递归排序前n-1个元素
Insert( elem , 0 , n - 1 , elem[n] );//再将elem[n]插入到数组中
}
}
//堆排序
int heap_size;//堆的大小
int parent(int i)
{
return i>>1;
}
int left(int i)
{
return i<<1;
}
int right(int i)
{
return i<<1 + 1;
}
void MaxHeapify(int elem[],int i)
{
int l = left(i);
int r = right(i);
int largest;
if( l <= heap_size && elem[l] > elem[i] )
{
largest = l;
}
else
{
largest = i;
}
if( r <= heap_size && elem[r] > elem[largest] )
{
largest = r;
}
if( largest != i )
{
swap( &elem[i] , &elem[largest] );
MaxHeapify( elem , largest );
}
}
void BuildMaxHeap(int elem[],int n)
{
heap_size = n;
for( int i = n/2 ; i >= 1 ; i-- )
{
MaxHeapify( elem , i );
}
}
void HeapSort(int elem[],int n)
{
BuildMaxHeap(elem,n);
for( int i = n ; i >= 2 ; i-- )
{
swap( &elem[1] , &elem[i] );
heap_size = heap_size - 1;
MaxHeapify( elem , 1 );
}
}
int main()
{
Input();
BubbleSort( elem , n );
InsertSort( elem , n );
SelectSort( elem , n );
MergeSort( elem , 0 , n-1 );
QuickSort( elem , 0 , n-1 );
CurInsertSort( elem , 0 , n-1 );
HeapSort( elem , n-1 );// 从1开始排序
Output();
return 0;
}