09-排序1 排序 (25 分)
给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。
本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:
数据1:只有1个元素;
数据2:11个不相同的整数,测试基本正确性;
数据3:103个随机整数;
数据4:104个随机整数;
数据5:105个随机整数;
数据6:105个顺序整数;
数据7:105个逆序整数;
数据8:105个基本有序的整数;
数据9:105个随机正整数,每个数字不超过1000。
输入格式:
输入第一行给出正整数N(≤10^5 ),随后一行给出N个(长整型范围内的)整数,其间以空格分隔。
输出格式:
在一行中输出从小到大排序后的结果,数字间以1个空格分隔,行末不得有多余空格。
输入样例:
11
4 981 10 -17 0 -20 29 50 8 43 -5
输出样例:
-20 -17 -5 0 4 8 10 29 43 50 981
表排序代码
用了2种方法,方法1是单纯按照表输出,第二种方法利用了环把表中的元素翻回来了,自己写了一个函数,并统一了函数接口
#include <iostream>
#define MaxSize 100000
int a[MaxSize];
using namespace std;
void GetData(int a[], int N) {
for (int i = 0; i < N; i++) {
cin >> a[i];//这里数据不需要后移
}
}
void DispArr(int a[], int N) {
cout << a[0];
N--;
int i = 1;
while (N--) {
cout << " " << a[i++];
}
}
int* TSort(int a[], int N) {
int* table = new int[N];
for (int i = 0; i < N; i++) {
table[i] = i;
}
int tmp;
int i, j;
for (i = 1; i < N; i++) {
tmp = a[table[i]];
for (j = i; j> 0 && tmp < a[table[j - 1]];j--) {
table[j] = table[j - 1];//不对原数组进行操作,只改变指针的内容
}
table[j] = i;
}
return table;
}
void DispArr2(int a[],int table[], int N) {
/*对数组a[],利用table[]表来输出*/
cout << a[table[0]];
N--;
int i = 1;
while (N--) {
cout << " " << a[table[i++]];
}
}
void NodeProcess(int a[], int table[], int head) {
/*根据数组a[]和table[]来处理head节点的相关环*/
int tmp = a[head];
int CurNode =head;
int NextNode = table[CurNode];
while (1) {
if (table[CurNode] == head) {
a[CurNode] = tmp;/*思考:这里的这两个语句处理能否写成一个函数?*/
table[CurNode] = CurNode;
break;
}
/*当前节点值改变*/
a[CurNode] = a[NextNode];
table[CurNode] = CurNode;
/*转移到下一个节点*/
CurNode = NextNode;
NextNode = table[CurNode];
}
}
void ChangeArr(int a[], int table[], int N) {
/*将数组a[]根据表table[]进行交换和修改*/
for (int i = 0; i < N; i++) {
if (table[i] != i) {
NodeProcess(a, table, i);
}
}
}
void TableSort(int a[], int N) {
/*统一函数接口*/
int* Table = TSort(a, N);
ChangeArr(a, Table, N);
delete []Table;
}
int main() {
int N;
cin >> N;
GetData(a, N);
/* 未统一接口的函数,方法1
int* Table=TSort(a, N);
DispArr2(a,Table,N);*/
/*方法2,统一了函数接口*/
TableSort(a, N);
DispArr(a, N);
return 0;
}
可以思考一下,在节点处理的时候,下面这个语句是否可以合并为一个函数,一开始我程序没有通过就是因为漏掉了一句,如果将两句语句封装为一个函数,那么程序看起来也美观(一个程序中如果多处出现相同的部分,那么应该考虑使用一个函数封装起来)。而且这个程序让我想起了一些链表相关的知识。
a[CurNode] = tmp;/*思考:这里的这两个语句处理能否写成一个函数?*/
table[CurNode] = CurNode;