测试代码见附录
题目
-
对于给定的线性表,A=(12,2,16,30,8,28,4,10,20),分别写出用下列排序方法对 A 进行排序时,每一趟处理后的结果。
-
插入排序
2 12 16 30 8 28 4 10 20 2 12 16 30 8 28 4 10 20 2 12 16 30 8 28 4 10 20 2 8 12 16 30 28 4 10 20 2 8 12 16 28 30 4 10 20 2 4 8 12 16 28 30 10 20 2 4 8 10 12 16 28 30 20 2 4 8 10 12 16 20 28 30
-
选择排序
2 12 16 30 8 28 4 10 20 2 4 16 30 8 28 12 10 20 2 4 8 30 16 28 12 10 20 2 4 8 10 16 28 12 30 20 2 4 8 10 12 28 16 30 20 2 4 8 10 12 16 28 30 20 2 4 8 10 12 16 20 30 28 2 4 8 10 12 16 20 28 30
-
希尔排序(递减序列:4,1)
8 2 4 10 12 28 16 30 20 2 4 8 10 12 16 20 28 30
-
冒泡排序(当自上而下在当前排序范围内执行一遍比较之后,假设最后往下移的结点是 a j a_j aj,则下一遍的排序范围为从 a 0 a_0 a0至 a j a_j aj)
2 12 16 8 28 4 10 20 30 2 12 8 16 4 10 20 28 30 2 8 12 4 10 16 20 28 30 2 8 4 10 12 16 20 28 30 2 4 8 10 12 16 20 28 30 2 4 8 10 12 16 20 28 30
-
基数排序(最低位优先)
30 10 20 12 2 4 16 8 28 2 4 8 10 12 16 20 28 30
注:非递减排序
-
-
选择排序,希尔排序和快速排序都是不稳定的,请举例说明。
-
选择排序
对于序列
下标 0 1 2 3 4 排序前 2 4 5 2* 1 第一趟排序后 1 4 5 2 2 在第一次循环中, a [ 0 ] a[0] a[0]和 a [ 4 ] a[4] a[4]发生交换,导致原来的 a [ 0 ] a[0] a[0]在 a [ 3 ] a[3] a[3]后面,使相等元素的相对位置发生了变化,从而导致排序的不稳定。
-
希尔排序
对于下述序列,设置递增序列初始值为4,
下标 0 1 2 3 4 5 6 7 8 排序前 40 13 40* 77 35 25 65 50 80 第一趟排序后 35 13 40* 77 40 25 65 50 80 在第一趟排序后, a [ 0 ] a[0] a[0]和 a [ 4 ] a[4] a[4]发生交换,导致原来的 a [ 0 ] a[0] a[0]在 a [ 2 ] a[2] a[2]后面,使相等元素的相对位置发生了变化,从而导致排序的不稳定。
-
快速排序
对于下述序列,取 p i v o t = a [ 0 ] pivot=a[0] pivot=a[0],
下标 0 1 2 3 4 5 6 7 8 排序前 40 13 40* 77 35 25 65 50 80 第一趟排序后 13 25 35 40* 40 77 65 50 80 第一趟排序后,原来的 a [ 0 ] a[0] a[0]在 a [ 2 ] a[2] a[2]后面,使相等元素的相对位置发生了变化,从而导致排序的不稳定。
-
-
写出基本的快速排序的 C 函数。对于给定的线性表,A=(46,26,46,68,46),给出用你写的代码段对 A 进行排序每一趟处理后的结果。
26 46 46 68 46 26 46 46 68 46 26 46 46 46 68
-
通过上面的观察可知,当有大量重复元素时,快速排序的效率还可以进一步提高。请尝试给出一种改进效率的方法,并分析它是如何改进的。
输出如下
26 46 46 46 68
方法如下,分析见注释。
#include<bits/stdc++.h> using namespace std; #define CUTOFF 1500 void Swap(int* a, int* b) { int tmp = *a; *a = *b; *b = tmp; } void insertionSort(int* a, int left, int right) { for (int i = left+1; i <= right; i++) { int tmp = a[i]; int j = i; for (; j >= left && a[j-1] > tmp; j--) { a[j] = a[j - 1]; } a[j] = tmp; } } int Median3(int* a, int left, int right) // 返回pivot { /*将三点中的最小值放在left,中位数放在center,最大值放在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]); /*将pivot放在right-1处*/ Swap(&a[center], &a[right - 1]); return a[right - 1]; } void quickSort(int* a, int left, int right) { if (left + CUTOFF <= right) // 大数组,用快排 { int pivot = Median3(a, left, right); int i = left, j = right - 1; for (;;) { while (a[++i] < pivot); while (a[--j] > pivot); if (i < j) // 需要交换 Swap(&a[i], &a[j]); else break; // 本次分割结束 } Swap(&a[i], &a[right - 1]); quickSort(a, left, i - 1); quickSort(a, i + 1, right); } else // 小数组,用插入排序 insertionSort(a, left, right); } int main() { int n; cin >> n; int* a = new int[n]; for (int i = 0; i < n; i++) cin >> a[i]; quickSort(a, 0, n - 1); for (int i = 0; i < n-1; i++) cout << a[i] << ' '; cout << a[n - 1] << endl; return 0; }
附录
-
测试代码
#include<bits/stdc++.h> using namespace std; int n = 9; void insertionSort(int a[], int n) { for (int p = 1; p < n; p++) { int tmp = a[p]; int j = p; for (; j >= 1 && a[j - 1] > tmp; j--) { a[j] = a[j - 1]; } a[j] = tmp; for (int i = 0; i < n; i++) cout << a[i] << ' '; cout << endl; } } void selectionSort(int a[], int n) { for (int i = 0; i < n - 1; i++) { int tmp = a[i]; int idx = i; int j = i + 1; for (; j < n; j++) { if (a[j] < tmp) { tmp = a[j]; idx = j; } } a[idx] = a[i]; a[i] = tmp; for (int i = 0; i < n; i++) cout << a[i] << ' '; cout << endl; } } void shellInsert(int a[], int n, int dk) { for (int i = dk; i < n; i++) { for (int j = i - dk; j >= 0; j -= dk) { if (a[j] > a[j + dk]) { int tmp = a[j]; a[j] = a[j + dk]; a[j + dk] = tmp; } } } } void shellSort(int a[], int n, int dt[], int t) { for (int k = 0; k < t; k++) { shellInsert(a, n, dt[k]); for (int i = 0; i < n; i++) cout << a[i] << ' '; cout << endl << endl; } } void bubbleSort(int a[], int right) { int flag = 0; int j = right; for (int i = 0; i < right - 1; i++) { if (a[i] > a[i + 1]) { flag = 1; j = i + 1; int tmp = a[i]; a[i] = a[i + 1]; a[i + 1] = tmp; } } for (int i = 0; i < n; i++) cout << a[i] << ' '; cout << endl; if (!flag || j==1) return; // 没有发生交换,则完成 return bubbleSort(a, j); } int getUnits(int a) { return a % 10; } int getTens(int a) { return (a - a % 10) % 10; } void radixSort(int a[], int n) { int radix = 1; int* count = new int[10]; int* tmp = new int[n]; memset(tmp, 0, sizeof(int) * n); for (int i = 1; i <= 2; i++) { memset(count, 0, sizeof(int) * 10); for (int j = 0; j < n; j++) { int k = (a[j] / radix) % 10; count[k]++; } for (int j = 1; j < 10; j++) { count[j] += count[j - 1]; } for (int j = n - 1; j >= 0; j--) { int k = (a[j] / radix) % 10; tmp[count[k] - 1] = a[j]; count[k]--; } for (int j = 0; j < n; j++) { a[j] = tmp[j]; } for (int j = 0; j < n; j++) cout << a[j] << ' '; cout << endl; radix *= 10; } delete []count; delete []tmp; } int main() { int a[] = { 12,2,16,30,8,28,4,10,20 }; cout << "The original sequency:" << endl; for (int i = 0; i < n; i++) cout << a[i] << ' '; cout << endl << endl; //insertionSort(a, n); //selectionSort(a, n); /*int dt[] = { 4,1 }; int t = 2; shellSort(a, n, dt, t);*/ //bubbleSort(a, n); //radixSort(a, n); return 0; }
-
无
#include<bits/stdc++.h>
using namespace std;
void quickSort(int* a, int left, int right, int n)
{
//if (left >= right) return;
if (left < right)
{
int pivot = a[left];
int i = left, j = right;
while (i != j)
{
while (i<j && a[j]>=pivot)
j--;
if (i < j) a[i] = a[j];
while (i < j && a[i] <= pivot)
i++;
if (i < j) a[j] = a[i];
}
a[i] = pivot;
for (int i = 0; i < n - 1; i++)
{
cout << a[i] << ' ';
}
cout << a[n - 1] << endl;
quickSort(a, left, i - 1, n);
quickSort(a, i + 1, right, n);
}
}
int main()
{
int n; cin >> n;
int* a = new int[n];
for (int i = 0; i < n; i++)
cin >> a[i];
quickSort(a, 0, n-1, n);
return 0;
}