首先向大家介绍HNU数据结构与算法分析-实验体系。
实验一共分为8个,
其中奇数个(1、3、5、7)为底层代码实现底层算法或数据结构,也称基础实验,
这一部分实验的代码需要同学们熟练掌握,甚至倒背如流,也会设置监考保证实验独立进行。
偶数个(2、4、6、8)为综合实验,是一些简单的应用类问题。
这八个实验合起来占HNUer的数据结构课程总成绩的20%。
最后,如果感觉有帮助的话还请点个赞,你的重要支持是我持续创作的动力。
那么让我们来看一下今天的题目吧
| 1. | shell排序 【问题描述】 输入若干整数,使用shell排序后输出。 输入的第一行一个整数 n ( 0 < n ≤ 107),表示待排序的数的个数。 接下来的一行,包含 n 个整数,表示待排序的数据。 输出为一行 n 个数,表示已排序后的数。 【样例输入】 5 5 4 3 2 1 【样例输出】 1 2 3 4 5 【样例说明】 |
|---|
# include# include using namespace std; void inssort(int *A, int n, int incr) { for(int i = incr; i < n; i += incr) for(int j = i; (j >= incr) && (A[j] < A[j - incr]); j -= incr) swap(A[j], A[j - incr]); } void shellsort(int *A, int n) { for (int i=n/2; i>2; i/=2) { for (int j=0;j> a[i]; shellsort(a, n); for(int i = 0; i < n; i++) cout << a[i] << " "; cout << endl; return 0; }
| 2. | 归并排序 【问题描述】 输入若干整数,使用归并排序后输出。 输入的第一行一个整数 n ( 0 < n ≤ 107),表示待排序的数的个数。 接下来的一行,包含 n 个整数,表示待排序的数据。 输出为一行 n 个数,表示已排序后的数。 【样例输入】 5 5 4 3 2 1 【样例输出】 1 2 3 4 5 【样例说明】 |
|---|
# include# include using namespace std; void mergesort(int *A, int *temp, int left, int right) { if (left==right) return; int mid = (left+right)/2; mergesort(A,temp,left,mid); mergesort(A,temp,mid+1,right); for (int i=left;i<=right;i++){temp[i]=A[i];} int i1=left; int i2=mid+1; for (int curr=left; curr<=right;curr++) { if (i1==mid+1) A[curr]=temp[i2++]; else if (i2>right) A[curr]=temp[i1++]; else if (temp[i1] > a[i]; mergesort(a, temp, 0, n - 1); for(int i = 0; i < n; i++) cout << a[i] << " "; cout << endl; return 0; }
| 3. | 快速排序 【问题描述】 输入若干整数,使用快速排序后输出。 输入的第一行一个整数 n ( 0 < n ≤ 107),表示待排序的数的个数。 接下来的一行,包含 n 个整数,表示待排序的数据。 输出为一行 n 个数,表示已排序后的数。 5 5 4 3 2 1 【样例输出】 1 2 3 4 5 【样例说明】 |
|---|
# include# include using namespace std; inline int findpivot(int *A, int i, int j) { return (i + j) / 2; } inline int Partition(int *A, int left, int right, int& pivot) { do { while(A[++left] < pivot); while((left < right) && (pivot < A[--right])); swap(A[left], A[right]); } while(left < right); return left; } void qsort(int *A, int left, int right) { int i=left; int j=right; if (j<=i) return; int pivotindex=findpivot(A,i,j); int temp=A[pivotindex]; A[pivotindex]=A[j]; A[j]=temp; int k=Partition(A,i-1,j,A[j]); int temp2=A[k]; A[k]=A[j]; A[j]=temp2; qsort(A,i,k-1); qsort(A,k+1,j); } int main() { int n; scanf("%d", &n); int *a; a = new int[n]; for(int i = 0; i < n; i++) cin >> a[i]; qsort(a, 0, n - 1); for(int i = 0; i < n; i++) cout << a[i] << " "; cout << endl; return 0; }



