冒泡排序,Bubble_Sort();
插入排序,Insertion_sort();
希尔排序 Shell_Sort(); //大数据效果显著
sedgewick序列的希尔排序
堆排序 Heap_Sort(); // 性能和希尔差不多,但更难写;应该比较稳定
归并排序 Merge_Sort();
归并排序非递归
//Bubble_Sort
#include <iostream>
using namespace std;
void Bubble_Sort(int A[], int N){
for(int p = N - 1; p > 0; p--){
bool flag = 0;
int tmp;
for(int i = 0; i < p; i++){
if(A[i] > A[i + 1]){
tmp = A[i];
A[i] = A[i + 1];
A[i + 1] = tmp;
flag = 1;
}
}
if(flag == 0) break;
}
}
void Insertion_Sort(int A[], int N){
int tmp;
for(int i = 1; i < N; i++){
tmp = A[i];
int j;
for(j = i; j > 0 && A[j - 1] > tmp; j--)
A[j] = A[j - 1];
A[j] = tmp;
}
}
void Shell_Sort(int A[], int N){
int D;
for(D = N / 2; D > 0; D /= 2){
for(int i = D; i < N; i++){
int j;
int tmp = A[i];
for(j = i; j >= D && A[j - D] > tmp; j -= D)
A[j] = A[j - D];
A[j] = tmp;
}
}
}
void sedgewick(int A[], int N){
int L[5] = {109, 41, 15, 5, 1};
for(int p = 0; p < 5; p++){
int D = L[p];
for(int i = D; i < N; i++){
int j;
int tmp = A[i];
for(j = i; j >= D && A[j - D] > tmp; j -= D)
A[j] = A[j - D];
A[j] = tmp;
}
}
}
void PercDown(int A[], int p, int N){
int parent, child;
int X = A[p];
for(parent = p; parent * 2 + 1 < N; parent = child){
child = parent * 2 + 1;
if(child != N - 1 && A[child + 1] > A[child]) child++;
if(A[child] <= X) break;
else A[parent] = A[child];
}
A[parent] = X;
}
void Heap_Sort(int A[], int N){
for(int i = N / 2 - 1; i >= 0; i--)
PercDown(A, i, N);
for(int i = N - 1; i > 0; i--){ //堆规模
int L;
L = A[0];
A[0] = A[i];
A[i] = L;
PercDown(A, 0, i);
}
}
void Merge(int A[], int tmpA[], int L, int R, int RightEnd){
int LeftEnd = R - 1;
int tmp = L;
int NumElements = RightEnd - L + 1;
while(L <= LeftEnd && R <= RightEnd){
if(A[L] <= A[R]) tmpA[tmp++] = A[L++];
else tmpA[tmp++] = A[R++];
}
while(L <= LeftEnd) tmpA[tmp++] = A[L++];
while(R <= RightEnd) tmpA[tmp++] = A[R++];
for(int i = 0; i < NumElements; i++, RightEnd--)
A[RightEnd] = tmpA[RightEnd];
}
void Msort(int A[], int tmpA[], int L, int RightEnd){
int center;
if(L < RightEnd){
center = (L + RightEnd) / 2;
Msort(A, tmpA, L, center);
Msort(A, tmpA, center + 1, RightEnd);
Merge(A, tmpA, L, center + 1, RightEnd);
}
}
void Merge_Sort(int A[], int N){
int* tmpA = new int[N];
Msort(A, tmpA, 0, N - 1);
delete [] tmpA;
}
void Merge1(int A[], int tmpA[], int L, int R, int RightEnd){
int tmp = L;
int LeftEnd = R - 1;
while(L <= LeftEnd && R <= RightEnd){
if(A[L] <= A[R]) tmpA[tmp++] = A[L++];
else tmpA[tmp++] = A[R++];
}
while(L <= LeftEnd) tmpA[tmp++] = A[L++];
while(R <= RightEnd) tmpA[tmp++] = A[R++];
}
void Merge_pass(int A[], int tmpA[], int N, int length){
int i;
for(i = 0; i <= N - 2 * length; i += 2 * length){
Merge1(A, tmpA, i, i + length, i + 2 * length - 1);
}
if(i + length < N) Merge1(A, tmpA, i, i + length, N -1);
else
for(int j = i; j < N; j++) tmpA[j] = A[j];
}
void Merge_Sort1(int A[], int N){
int* tmpA = new int[N];
int length = 1;
while(length < N){
Merge_pass(A, tmpA, N, length);
length *= 2;
Merge_pass(tmpA, A, N, length);
length *= 2;
}
delete[] tmpA;
}
int main()
{
int A[100005] = {0};
int N;
cin >> N;
for(int i = 0; i < N; i++)
cin >> A[i];
Merge_Sort1(A, N);
for(int i = 0; i < N - 1; i++)
cout << A[i] << ' ';
cout << A[N - 1];
}