排序算法
#include "iostream"
#include "vector"
using namespace std;
void InsertSort(vector<int> &A) {
if (A.size() == 0 || A.size() == 1)
return;
for (int i = 1, j; i < A.size(); i++) {
int temp = A[i];
if (A[i - 1] > A[i]) {
for (j = i - 1; j >= 0 && A[j] > temp; j--)
A[j + 1] = A[j];
A[j + 1] = temp;
}
}
}
void BinaryInsertSort(vector<int> &A) {
if (A.size() == 0 || A.size() == 1)
return;
for (int i = 1, j; i < A.size(); i++) {
int temp = A[i];
if (A[i - 1] > A[i]) {
int low = 0, high = i - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (A[mid] > temp)
high = mid - 1;
else
low = mid + 1;//确保算法稳定性,当A[mid] == temp时,仍然需要在mid右方寻找插入位置
}
for (j = i - 1; j >= low; j--)
A[j + 1] = A[j];
A[low] = temp;
}
}
}
void ShellSort(vector<int> &A) {
if (A.size() == 0 || A.size() == 1)
return;
for (int d = A.size() / 2; d >= 1; d /= 2) {
for (int i = d, j; i < A.size(); i++) {
if (A[i] < A[i - d]) {
int temp = A[i];
for (j = i - d; j >= 0 && A[j] > temp; j -= d) {
A[j + d] = A[j];//记录后移,寻找插入的位置
}
A[j + d] = temp;
}
}
}
}
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
void BubbleSort(vector<int> &A) {
if (A.size() == 0 || A.size() == 1)
return;
for (int i = 0; i < A.size(); i++) {
bool flag = true;
for (int j = A.size() - 1; j > i; j--) {
if (A[j - 1] > A[j]) {
swap(A[j - 1], A[j]);
flag = false;
}
}
if (flag == true)//本趟遍历后没有发生交换,说明表已经有序
break;
}
}
int Partition(vector<int> &A, int low, int high) {
int pivot = A[low];
while (low < high) {
while (A[high] >= pivot && low < high) {
high--;
}
A[low] = A[high];
while (A[low] <= pivot && low < high) {
low++;
}
A[high] = A[low];
}
A[low] = pivot;
return low;
}
void QuickSort(vector<int> &A, int low, int high) {
if (low < high) {
int pivotpos = Partition(A, low, high);
QuickSort(A, low, pivotpos - 1);
QuickSort(A, pivotpos + 1, high);
}
}
void SelectSort(vector<int> &A) {
if (A.size() == 0 || A.size() == 1)
return;
for (int i = 0; i < A.size() - 1; i++) {
int min = i;
for (int j = i + 1; j < A.size(); j++) {
if (A[j] < A[min])
min = j;
}
if (min != i)
swap(A[min], A[i]);
}
}
//对以k为根的子树进行调整
void HeadAdjust(vector<int> &A, int k, int len) {
A[0] = A[k];
for (int i = 2 * k; i <= len; i *= 2) {
if (i < len && A[i] < A[i + 1])
i++;
if (A[0] >= A[i])//调整结束
break;
else {
A[k] = A[i];
k = i;
}
}
A[k] = A[0];
}
void BuildMaxHeap(vector<int> &A, int len) {
for (int i = len / 2; i > 0; i--) {
HeadAdjust(A, i, len);
}
}
void HeapSort(vector<int> &A) {
int len = A.size() - 1;
if (len == 0 || len == 1)
return;
BuildMaxHeap(A, len);
for (int i = len; i > 1; i--) {
swap(A[i], A[1]);
HeadAdjust(A, 1, i - 1);
}
}
void Merge(vector<int> &A, int low, int mid, int high) {
int *temp = new int[A.size()]; //辅助数组temp
for (int i = low; i <= high; i++) {
temp[i] = A[i]; //将A中元素复制到辅助数组temp中
}
int i = low, j = mid + 1, k = low;
while (i <= mid && j <= high) {
if (temp[i] <= temp[j]) { //比较左右两段中的元素
A[k++] = temp[i++];
} else {
A[k++] = temp[j++];
}
}
while (i <= mid) //第一段没有检测完
A[k++] = temp[i++];
while (j <= high) //第二段没有检测完
A[k++] = temp[j++];
}
void MergeSort(vector<int> &A, int low, int high) {
if (low < high) {
int mid = (low + high) / 2;
MergeSort(A, low, mid); //对左侧子序列进行归并排序
MergeSort(A, mid + 1, high); //对右侧子序列进行归并排序
Merge(A, low, mid, high); //归并
}
}
int main() {
vector<int> arr = {25, 56, 12, 6, 3, 78, 5, 99, 7};
vector<int> A = {25, 56, 12, 6, 3, 78, 5, 99, 7};
vector<int> B = {25, 56, 12, 6, 3, 78, 5, 99, 7};
vector<int> C = {25, 56, 12, 6, 3, 78, 5, 99, 7};
vector<int> D = {25, 56, 12, 6, 3, 78, 5, 99, 7};
vector<int> E = {25, 56, 12, 6, 3, 78, 5, 99, 7};
vector<int> F = {25, 56, 12, 6, 3, 78, 5, 99, 7};
vector<int> G = {0, 25, 56, 12, 6, 3, 78, 5, 99, 7};
vector<int> H = {25, 56, 12, 6, 3, 78, 5, 99, 7};
InsertSort(A);
BinaryInsertSort(B);
ShellSort(C);
BubbleSort(D);
QuickSort(E, 0, E.size());
SelectSort(F);
HeapSort(G);
MergeSort(H, 0, H.size() - 1);
cout << "原始序列:";
for (auto num: arr) {
printf("%d ", num);
}
cout << "\n插入排序:";
for (auto num: A) {
printf("%d ", num);
}
cout << "\n二分插入:";
for (auto num: B) {
printf("%d ", num);
}
cout << "\n希尔排序:";
for (auto num: C) {
printf("%d ", num);
}
cout << "\n冒泡排序:";
for (auto num: D) {
printf("%d ", num);
}
cout << "\n快速排序:";
for (auto num: E) {
printf("%d ", num);
}
cout << "\n选择排序:";
for (auto num: F) {
printf("%d ", num);
}
cout << "\n堆排序:";
for (int i = 1; i < G.size(); i++) {
printf("%d ", G[i]);
}
cout << "\n归并排序:";
for (auto num: H) {
printf("%d ", num);
}
return 0;
}