5-12 排序 (25分)

来源:互联网 发布:修身夹克 知乎 编辑:程序博客网 时间:2024/05/16 00:46
5-12 排序   (25分)

给定NN个(长整型范围内的)整数,要求输出从小到大排序后的结果。

本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:

  • 数据1:只有1个元素;

  • 数据2:11个不相同的整数,测试基本正确性;

  • 数据3:103个随机整数;

  • 数据4:104个随机整数;

  • 数据5:105个随机整数;

  • 数据6:105个顺序整数;

  • 数据7:105个逆序整数;

  • 数据8:105个基本有序的整数;

  • 数据9:105个随机正整数,每个数字不超过1000。

    输入格式:

    输入第一行给出正整数NN\le 10^5105),随后一行给出NN个(长整型范围内的)整数,其间以空格分隔。

    输出格式:

    在一行中输出从小到大排序后的结果,数字间以1个空格分隔,行末不得有多余空格。

    输入样例:

    114 981 10 -17 0 -20 29 50 8 43 -5

    输出样例:

    -20 -17 -5 0 4 8 10 29 43 50 981
  • #include<stdio.h>  #include<stdlib.h>  #include<algorithm>#define MAX 100000using namespace std;  void Swap(int *a,int *b){int t;t = *a;*a = *b;*b = t;}void print(int A[],int N){for(int i = 0; i < N; i++){printf("%d",A[i]);if(i < N - 1){printf(" ");}}printf("\n");}/*冒泡排序*/void maopao_sort(int A[],int N){int p,flag;for(p = N - 1; p >= 0; p--){flag = 0;for(int i = 0; i < p; i++){if(A[i] > A[i + 1]){Swap(&A[i],&A[i + 1]);flag = 1;}}if(flag == 0)break;}print(A,N);}/*插入排序*/void Insert_sort(int A[],int N){int p,Tmp;for(int i = 1; i < N; i++){Tmp = A[i];for(p = i; p > 0 && A[p - 1] > Tmp; p--){A[p] = A[p - 1];/*将大的一个一个向后推*/ }A[p] = Tmp;/*最后放到合适的位置*/}print(A,N);}/*希尔排序*/void shell_sort(int A[],int N){int p,Tmp,d,si,i;int Sedgewick[] = {929, 505, 209, 109, 41, 19, 5, 1, 0};for(int si = 0; Sedgewick[si] >= N; si++);/*初始增量Sedgewick[si]不能超过序列长度(N)*/for(d = Sedgewick[si]; d > 0; d = Sedgewick[++si]){for(i = d; i < N; i++)/*在数组A中,从下标为d开始往后扫描*/{Tmp = A[i];for(p = i; p >= d && A[p - d] > Tmp; p -= d)/*每次判断A[p - d] 与 A[p]的大小关系,当p < d时说明A[p]前没有d那么多个数了*/{A[p] = A[p - d];}A[p] = Tmp;}}print(A,N);}/*堆排序*/ void percDown(int A[],int p,int N)/*构建最大堆,因为再后面要将数组第一个元素与最后一个互换,所以再输出的时候就是从小到大输出的*/{int child,parent;int X;X = A[p];for(parent = p; (parent * 2) + 1 < N; parent = child){child = parent * 2 + 1;if(child != N - 1 && A[child] < A[child + 1]){child++;}if(X >= A[child]) break;else{A[parent] = A[child];}}A[parent] = X;}void Heap_sort(int A[],int N){for(int i = (N - 1)/2 ; i >= 0; i--){percDown(A,i,N);}for(int i = N - 1; i > 0; i--){Swap(&A[0],&A[i]);/*交换后数组A的最后一位就是最大值,并且下次循环的时候不会将最后一位进入percDown函数*/percDown(A,0,i);}print(A,N);}/*归并排序*/void Merge(int A[],int TmpA[],int L,int R,int Rightend)/* L = 左边起始位置, R = 右边起始位置, RightEnd = 右边终点位置*/{int num,Leftend;Leftend = R - 1;int Tmp = L;num = Rightend - L + 1;while(L <= Leftend && R <= Rightend){if(A[L] >= A[R]){TmpA[Tmp++] = A[R++];} else{TmpA[Tmp++] = A[L++];}}while(L <= Leftend) TmpA[Tmp++] = A[L++];while(R <= Rightend) TmpA[Tmp++] = A[R++];for(int i = 0; i < num; i++, Rightend--){A[Rightend] = TmpA[Rightend];/*从后往前赋给A数组*/ }}void Msort(int A[],int TmpA[],int L,int Rightend){int mid;if(L < Rightend){mid = (L + Rightend)/2;Msort(A,TmpA,L,mid);Msort(A,TmpA,mid + 1,Rightend);Merge(A,TmpA,L,mid + 1,Rightend);}}void MergeSort(int A[],int N)/*递归方法*/{int *TmpA = (int *)malloc(N * sizeof(int));if(TmpA != NULL){Msort(A,TmpA,0,N - 1);free(TmpA);}else{printf("空间不足");} print(A,N);}void Merge_pass(int A[],int TmpA[],int length,int N)/*循环实现*/{int i,j;for(i = 0 ; i <= N - length*2; i += length*2){Merge(A, TmpA, i, i + length, i + length*2 - 1);}if ( i+length < N ) /* 归并最后2个子列*/       Merge( A, TmpA, i, i+length, N-1);   else /* 最后只剩1个子列*/       for ( j = i; j < N; j++ ) TmpA[j] = A[j];}void Merge_Sort(int A[],int N){int length = 1;int *TmpA = (int *)malloc(N * sizeof(int));if(TmpA != NULL){while(length < N){Merge_pass(A,TmpA,length,N);length *= 2;Merge_pass(TmpA,A,length,N);length *= 2;}free(TmpA);}else{printf("空间不足");}print(A,N);}int main(void){int N;int A[MAX];scanf("%d",&N);for(int i = 0; i < N; i++){scanf("%d",&A[i]);}//maopao_sort(A,N);/*冒泡排序*///Insert_sort(A,N);/*插入排序*///shell_sort(A,N);/*希尔排序*///Heap_sort(A,N);/*堆排序*///MergeSort(A,N);/*归并排序 - 递归方法*/Merge_Sort(A,N);/*归并排序 - 循环实现*/return 0;}



  • 0 0
    原创粉丝点击