#include <iostream>
using namespace std;
void output(int a[], int n) {
for (int i = 0; i < n; ++i) {
cout << a[i] << " ";
}
cout << endl;
}
void bubble(int a[], int n) {
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
if (a[i] > a[j]) {
swap(a[i], a[j]);
}
}
}
}
int partition(int a[], int left, int right) {
int pivot = a[left];
int l = left, r = right;
while (l < r) {
while (l < r && a[r] > pivot) r--;
if (l < r) a[l++] = a[r];
while (l < r && a[l] < pivot) l++;
if (l < r) a[r--] = a[l];
}
a[l] = pivot;
return l;
}
void quicksort(int a[], int l, int r) {
if (l < r) {
int pivot = partition(a, l, r);
partition(a, l, pivot - 1);
partition(a, pivot + 1, r);
}
}
void down(int a[], int i, int n) {
int parent = i;
int child = i * 2;
while (child + 1 < n && a[child + 1] > a[child]) {
child += 1;
}
while (child < n && a[child] > a[parent]) {
swap(a[child], a[parent]);
parent = child;
}
child = child * 2 + 1;
}
void buildheap(int a[], int n) {
for (int i = n / 2; i >= 0; i--) {
down(a, i, n);
}
}
void heapsort(int a[], int n) {
buildheap(a, n);
for (int i = n - 1; i > 0; i--) {
swap(a[i], a[0]);
buildheap(a, i);
}
}
void insertsort(int a[], int n) {
for (int i = 1; i < n; i++) {
int num = a[i];
int j = i - 1;
while (num < a[j]) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = num;
}
}
void selectsort(int a[], int n) {
for (int i = 0; i < n; i++) {
int index = i;
for (int j = i + 1; j < n; j++) {
if (a[j] < a[index]) {
index = j;
}
}
swap(a[i], a[index]);
}
}
void merge(int a[], int l, int m, int r) {
int i = l, j = m + 1, k = 0;
int len = r - l + 1;
int *s = new int[len];
while(i <= m && j <= r) {
if (a[i] <= a[j]) s[k++] = a[i++];
else s[k++] = a[j++];
}
while (i <= m) s[k++] = a[i++];
while (j <= r) s[k++] = a[j++];
for (i = l, k = 0; i <= r;i++, k++) {
a[i] = s[k];
}
}
void mergesort(int a[], int l, int r) {
if (l < r) {
int m = (l + r) / 2;
mergesort(a, l, m);
mergesort(a, m + 1, r);
merge(a, l, m, r);
}
}
void shell(int a[], int dk, int n) {
for (int i = dk; i < n; i++) {
int j = i - dk;
int num = a[i];
while (num < a[j]) {
a[j + dk] = a[j];
j -= dk;
}
a[j + dk] = num;
}
}
void shellsort(int a[], int n) {
int dk = n / 2;
while (dk) {
shell(a, dk, n);
dk /= 2;
}
}
void bucketsort(int a[], int n) {
int bucket[105] = {0};
for (int i = 0; i < n; i++) {
bucket[a[i]]++;
}
for (int j = 0, i = 0; j < 105; j++) {
while (bucket[j]) {
a[i++] = j;
bucket[j]--;
}
}
}
int main() {
cout << "请输入待排序个数:" << endl;
int n;
cin >> n;
cout << "请输入待排序数字: " << endl;
int a[105] = {0};
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
// cout << "1.冒泡排序:" << endl;
// bubble(a, n);
// output(a, n);
// cout << "2.快速排序:" << endl;
// quicksort(a, 0, n - 1);
// output(a, n);
// cout << "3.堆排序:" << endl;
// heapsort(a, n);
// output(a, n);
// cout << "4.插入排序:" << endl;
// insertsort(a, n);
// output(a, n);
// cout << "5.选择排序:" << endl;
// selectsort(a, n);
// output(a, n);
// cout << "6.归并排序:" << endl;
// mergesort(a, 0, n - 1);
// output(a, n);
// cout << "7.希尔排序:" << endl;
// shellsort(a, n);
// output(a, n);
// cout << "8.桶排序:" << endl;
// bucketsort(a, n);
// output(a, n);
return 0;
}
c++ 八大排序算法
于 2022-10-16 14:09:18 首次发布