09-排序1 排序 (25分)
来源:互联网 发布:如何防止网络购物诈骗 编辑:程序博客网 时间:2024/05/18 22:16
给定NN个(长整型范围内的)整数,要求输出从小到大排序后的结果。
本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:
数据1:只有1个元素;
数据2:11个不相同的整数,测试基本正确性;
数据3:103个随机整数;
数据4:104个随机整数;
数据5:105个随机整数;
数据6:105个顺序整数;
数据7:105个逆序整数;
数据8:105个基本有序的整数;
数据9:105个随机正整数,每个数字不超过1000。
输入格式:
输入第一行给出正整数NN(\le 10^5≤10
5
),随后一行给出NN个(长整型范围内的)整数,其间以空格分隔。
输出格式:
在一行中输出从小到大排序后的结果,数字间以1个空格分隔,行末不得有多余空格。
输入样例:
11
4 981 10 -17 0 -20 29 50 8 43 -5
输出样例:
-20 -17 -5 0 4 8 10 29 43 50 981
AC代码:
#include <iostream>using namespace std; int* copy(int* a,int len){ int* num; num = new int[len]; for ( int i = 0 ; i < len ; i++){ num[i] = a[i]; } return num;}void Buble_Sort(int *a ,int N){ for ( int i = 0 ; i < N - 1 ; i++){ for ( int j = i + 1 ; j < N ; j++){ if ( a[i] > a[j]){ a[i] = a[i] + a[j]; a[j] = a[i] - a[j]; a[i] = a[i] - a[j]; } } }}void Insert_Sort(int *a ,int N){ for ( int i = 1 ; i < N ; i++){ int tmp = a[i]; int j; for(j = i ; j > 0 && a[j-1] > tmp ; j--){ a[j] = a[j-1]; } a[j] = tmp; }}/* 将N个元素的数组中以A[p]为根的子堆调整为最大堆 */void PreDown(int *a , int p , int N){ int parent,child; int x = a[p]; for (parent = p ; (parent*2 +1) < N ; parent = child){ child = 2 * parent+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){ int i; for ( i = N/2 - 1 ; i >= 0 ; i--){ PreDown(a,i,N); } for ( i = N -1 ; i > 0 ; i--){ a[0] = a[i] + a[0]; a[i] = a[0] - a[i]; a[0] = a[0] - a[i]; PreDown(a,0,i); } }void Merge1(int a[] ,int tmp[],int left ,int right,int rightend){ int leftend = right-1; int len = rightend - left + 1; int x = left; while(left <= leftend && right <= rightend){ if ( a[left] <= a[right]){ tmp[x++] = a[left++]; }else{ tmp[x++] = a[right++]; } } while(left <= leftend){ tmp[x++] = a[left++]; } while(right <= rightend){ tmp[x++] = a[right++]; } for( int i = rightend ; len > 0 ; len--,i--){ a[i] = tmp[i]; } }void Mergesort(int a[],int tmp[],int left,int right){ if ( left < right){ int mid = (left+right)/2; Mergesort(a,tmp,left,mid); Mergesort(a,tmp,mid+1,right); Merge1(a,tmp,left,mid+1,right); }}void Merge_Sort1(int a[] ,int N){ int* tmp; tmp = new int[N]; if (tmp != NULL){ Mergesort(a,tmp,0,N-1); }else{ cout<<"内存不足"<<endl; } }void swap(int* a ,int *b){ int tmp = *a; *a = *b; *b = tmp;}int Median3(int 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]); } swap(&a[center], &a[right-1]); /* 将基准放在数组右端 */ return a[right-1];}void Qsort(int a[],int left ,int right){ int cutoff = 100; int low,high,pivot; if ( right - low > cutoff){ 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{ Insert_Sort(a+left,right-left+1); }}void Quick_Sort(int a[],int N){ Qsort(a,0,N-1); } void Print(int *a , int N){ cout<<a[0]; for ( int i = 1 ; i < N ; i++){ cout<<" "<<a[i]; }}int main(){ int len; cin>>len; int* a; a = new int[len]; for ( int i = 0 ; i < len ; i++){ cin>>a[i]; } //冒泡排序 int* copy_num; copy_num = copy(a,len); Buble_Sort(copy_num,len); Print(copy_num,len); cout<<endl; //插入排序 copy_num = copy(a,len); Insert_Sort(copy_num,len); Print(copy_num,len); cout<<endl; //堆排序 copy_num = copy(a,len); Heap_Sort(copy_num,len); Print(copy_num,len); cout<<endl; //归并排序(递归版) copy_num = copy(a,len); Merge_Sort1(copy_num,len); Print(copy_num,len); cout<<endl; /*//快速排序 copy_num = copy(a,len); Quick_Sort(copy_num,len); Print(copy_num,len); cout<<endl;*/ return 0;}
0 0
- PTA 09-排序1 排序 (25分)
- 09-排序1 排序 (25分)
- 09-排序1 排序 (25分)
- 09-排序1 排序 (25分)
- 排序算法-09-排序1 排序 (25分)-第一部分
- 排序算法-09-排序1 排序 (25分)-第二部分
- 09-排序1 排序 (25分)
- 5-12 排序 (25分)
- 5-12 排序 (25分)
- 5-12 排序 (25分)
- 5-3 排序 (25分)
- 09-排序2 Insert or Merge (25分)
- 09-排序3 Insertion or Heap Sort (25分)
- 09-排序2 Insert or Merge (25分)
- 09-排序3 Insertion or Heap Sort (25分)
- 09-排序2 Insert or Merge (25分)
- 09-排序3 Insertion or Heap Sort (25分)
- 09-排序2 Insert or Merge (25分)
- Python语言文件基础--Python(18)
- mac brew install node 安装总是版本不对
- ssm整合之七 事务以及404页面处理
- C#162课的主要内容
- 09-排序2 Insert or Merge (25分)
- 09-排序1 排序 (25分)
- java主类结构
- View浅析
- 第七讲 分支结构程序体验 1,正差值计算
- View的事件浅析
- 一个基于TensorFlow的简单故事生成案例:带你了解LSTM
- 安装sublime text3
- 第七讲程序分支结构体验 2三数最大值
- PHP常用数组函数