实验内容及要求:
输入n个整数,用快速排序、堆排序与2路归并排序算法实现由小到大排序并输出排序结果。要求排序数据及排序结果用字符文件实现输入与输出。
实验目的:掌握快速排序、堆排序与2路归并排序算法。
#include <iostream>
#include <fstream>
using namespace std;
void quickSort(int* origin, int left, int right) {
if (left >= right) {
return ;
}
int i = left - 1;
int j = right + 1;
int x = origin[(left + right) >> 1];
while (i < j) {
i++;
while (origin[i] < x) {
i++;
}
j--;
while (origin[j] > x) {
j--;
}
if (i < j) {
swap(origin[i], origin[j]);
}
}
quickSort(origin, left, j);
quickSort(origin, j + 1, right);
}
void down(int *origin, int u, int length) {
int t = u;
if (2 * u <= length && origin[t] > origin[2 * u]) {
t = 2 * u;
}
if (2 * u + 1 <= length && origin[t] > origin[2 * u + 1]) {
t = 2 * u + 1;
}
if (u != t) {
swap(origin[u], origin[t]);
down(origin, t, length);
}
}
int heapTemp[1000];
void heapSort(int *origin, int length) {
for (int i = length / 2; i; i--) {
down(origin, i, length);
}
int i = 0;
int m = length;
while (m--) {
heapTemp[i] = origin[1];
i++;
origin[1] = origin[length--];
down(origin, 1, length);
}
}
int mergeTemp[1000];
void mergeSort(int* origin, int left, int right) {
if (left >= right) {
return ;
}
int mid = (left + right) >> 1;
mergeSort(origin, left, mid);
mergeSort(origin, mid + 1, right);
int k = 0;
int i = left;
int j = mid + 1;
while (i <= mid && j <= right) {
if (origin[i] <= origin[j]) {
mergeTemp[k++] = origin[i++];
} else {
mergeTemp[k++] = origin[j++];
}
}
while (i <= mid) {
mergeTemp[k++] = origin[i++];
}
while (j <= right) {
mergeTemp[k++] = origin[j++];
}
for (i = left, j = 0; i <= right; i++, j++) {
origin[i] = mergeTemp[j];
}
}
int main() {
fstream file("../input.txt", ios::in);
int length;
file >> length;
int origin[length];
for (int i = 0; i < length; i++) {
file >> origin[i];
}
int quick_result[length];
int heap_result[length + 1];
int merge_result[length];
for (int i = 0; i < length; i++) {
quick_result[i] = origin[i];
merge_result[i] = origin[i];
heap_result[i + 1] = origin[i];
}
quickSort(quick_result, 0, length - 1);
heapSort(heap_result, length);
mergeSort(merge_result, 0, length - 1);
file.close();
fstream outfile("../output.txt", ios::out);
outfile << "Quick Sort Result:" << endl;
for (int i = 0; i < length; i++) {
outfile << quick_result[i] << " ";
}
outfile << endl;
outfile << "Heap Sort Result:" << endl;
for (int i = 0; i < length; i++) {
outfile << heapTemp[i] << " ";
}
outfile << endl;
outfile << "Merge Sort Result:" << endl;
for (int i = 0; i < length; i++) {
outfile << merge_result[i] << " ";
}
outfile.close();
return 0;
}