找女朋友
Description
山东理工大学有很多学生,当然也有很多美女,机械实验班的学委(外号:大王八)很想找个女朋友,但他想找个身高和自己相配的女生做女朋友,现有理工大N个美女的身高数据,但由于N的值较大,为了尽快找到合适的女友,大王八想请你帮他完成这N个美女的身高排序,按降序排列。
Input
输入包括两行,第一行是一个正整数N(N<=1000000),表示理工大共N个美女。第二行有N个正整数分别表示N位美女的身高,每个正整数的值不会超过10^9。 (输入数据之间会用空格隔开)
Output
输出只有一行,为这N个数的降序序列,数与数之间用空格隔开。
Sample
Input
5
1 3 2 5 4
Output
5 4 3 2 1
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<time.h>
#include <stdlib.h>
typedef int ElemType;
//初始化表
void arr_Init(int arr[],int len)
{
int i;
ElemType x;
for (i = 0; i <len; i++)
{
scanf("%d", &x);
arr[i] = x;
}
//--------------------用随机数测试程序
//srand(time(NULL));
//for (int i = 0; i < len; i++)
//{
// arr[i] = rand() % 100;
//}
}
//打印表中元素
void arr_Print(ElemType *arr,int len)
{
int i,count=0;
for (i = 0; i < len; i++)
{
if (count != 0)
{//去掉输出时的第一个的空格,保证输出时每个元素间用空格割开,没有多余的空格
printf(" ");
}
count++;
printf("%d",arr[i]);
}
}
//交换两个元素
void swap(ElemType& a, ElemType& b)
{
ElemType temp;
temp = a;
a = b;
b = temp;
}
//分治
int Partition(int A[], int left, int right)//left和right都是数组的下标
{//扫描所有元素,将最右边的数值作为中位数,将数组分成两部分
/*
从最左边的数开始依次和最右边的数进行对比,
小的则放到右边(从最右边的位置依次开始放),用k记录要放到哪个位置
大的不作交换
*/
int k, j;//k始终指向要被交换的位置,j始终指向扫描到的位置
for (k = j = left; j < right; j++)
{
if (A[j] > A[right])
{
swap(A[j], A[k]);
k++;
}
}
swap(A[k], A[right]);
return k;//返回值K是中间值的下标
}
//快排
void QuickSort(int A[], int low, int high)
{
if (low < high)
{
int position = Partition(A, low, high);
QuickSort(A, low, position - 1);
QuickSort(A, position + 1, high);
}
}
int main()
{
int *arr;
int N;
scanf("%d", &N);
arr = (ElemType*)malloc(sizeof(int) * N);
//输入N个数,将他们存入数值A中,用动态分配地址的方式
arr_Init(arr, N);
QuickSort(arr, 0, N-1);
arr_Print(arr,N);
return 0;
}
遇到的问题
- 不要把数据写死
- 出现问题时多用几种不同的测试用例进行调试,查看与题目中输出结果不符的原因
- 不同的测试用例:
1. 输入不同个数的元素值
2. 每次输入的元素值不同