排序算法

一、插入排序
将当前元素插入到前面已排序序列的合适位置。稳定。时间复杂度:平均 O(n²),最好 O(n)。空间:O(1)
cpp
#include <iostream>
using namespace std;
// 插入排序函数
void insertionSort(int arr[], int n) {
for (int i = 1; i < n; i++) {
int key = arr[i]; // 当前要插入的元素
int j = i - 1;
// 将比key大的元素向后移动
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key; // 插入key到正确位置
// 输出本次排序后的结果
cout << "第 " << i << " 次插入后: ";
for (int k = 0; k < n; k++) {
cout << arr[k] << " ";
}
cout << endl;
}
}
int main() {
int arr[] = {15, 9, 7, 8, 20, -1, 4};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "原始数组: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << "\n\n插入排序\n\n";
insertionSort(arr, n);
cout << "最终排序结果: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}

二、冒泡排序
反复遍历,相邻比较并交换,每轮把最大元素"浮"到最后。稳定。时间复杂度:平均 O(n²),最好 O(n)。空间:O(1)。
cpp
#include <iostream>
using namespace std;
// 冒泡排序函数
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
bool swapped = false; // 优化:如果某轮没有交换,说明已经有序
// 每轮将最大的元素"冒泡"到末尾
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// 交换相邻元素
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}
// 输出本次排序后的结果
cout << "第 " << i + 1 << " 次冒泡后: ";
for (int k = 0; k < n; k++) {
cout << arr[k] << " ";
}
cout << endl;
// 如果没有发生交换,说明已经有序,提前结束
if (!swapped) {
break;
}
}
}
int main() {
int arr[] = {15, 9, 7, 8, 20, -1, 4};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "原始数组: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << "\n\n冒泡排序\n";
bubbleSort(arr, n);
cout << "\n最终排序结果: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}

三、选择排序
cpp
#include <iostream>
#include <vector>
using namespace std;
// 选择排序函数
void selectionSort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
int minIndex = i;
// 在未排序部分找到最小元素的索引
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// 交换最小元素和当前位置元素
if (minIndex != i) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
// 输出本次排序后的结果
cout << "第 " << i + 1 << " 次排序后: ";
for (int k = 0; k < n; k++) {
cout << arr[k] << " ";
}
cout << endl;
}
}
int main() {
int arr[] = {15, 9, 7, 8, 20, -1, 4};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "原始数组: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << "\n\n选择排序\n";
selectionSort(arr, n);
cout << "\n最终排序结果: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}

四、希尔排序
插入排序的改进版,先按一定间隔分组排序,逐渐缩小间隔直至为1。不稳定。时间复杂度:依赖增量序列,通常 O(n^1.3) 左右,最坏 O(n²)。空间:O(1)。
cpp
#include <iostream>
using namespace std;
// 希尔排序函数
void shellSort(int arr[], int n) {
int step = 1;
// 选择初始间隔(这里使用希尔增量,每次除以2)
for (int gap = n / 2; gap > 0; gap /= 2) {
cout << "第 " << step++ << " 趟排序 (间隔 gap = " << gap << "):" << endl;
// 对每个子序列进行插入排序
for (int i = gap; i < n; i++) {
int temp = arr[i];
int j;
// 在子序列中进行插入排序
for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
arr[j] = arr[j - gap];
}
arr[j] = temp;
}
// 输出当前间隔排序后的结果
cout << " 排序后: ";
for (int k = 0; k < n; k++) {
cout << arr[k] << " ";
}
cout << endl << endl;
}
}
int main() {
int arr[] = {15, 9, 7, 8, 20, -1, 4};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "原始数组: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << "\n\n希尔排序\n";
shellSort(arr, n);
cout << "最终排序结果: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}

五、快速排序
cpp
#include <iostream>
using namespace std;
// 划分函数:使用data[low]作为枢轴元素
int partition(int data[], int low, int high) {
int pivot = data[low]; // 枢轴元素
int i = low;
int j = high;
cout << " 枢轴=" << pivot << " ";
while (i < j) {
// 从右向左找小于枢轴的元素
while (i < j && data[j] >= pivot)
j--;
if (i < j) {
data[i] = data[j];
i++;
}
// 从左向右找大于枢轴的元素
while (i < j && data[i] <= pivot)
i++;
if (i < j) {
data[j] = data[i];
j--;
}
}
// 将枢轴元素放入最终位置
data[i] = pivot;
return i; // 返回枢轴位置
}
// 快速排序
void quickSort(int data[], int low, int high, int n) {
if (low < high) {
cout << " 排序范围 [" << low << ", " << high << "]: ";
for (int k = low; k <= high; k++) {
cout << data[k] << " ";
}
cout << endl;
int loc = partition(data, low, high); // 进行划分
cout << " 划分后: ";
for (int k = 0; k < n; k++) {
cout << data[k] << " ";
}
cout << " (枢轴位置=" << loc << ")" << endl;
quickSort(data, low, loc - 1, n); // 对前半区进行快速排序
quickSort(data, loc + 1, high, n); // 对后半区进行快速排序
}
}
int main() {
int data[] = {15, 9, 7, 8, 20, -1, 4};
int n = sizeof(data) / sizeof(data[0]);
cout << "原始数组: ";
for (int i = 0; i < n; i++) {
cout << data[i] << " ";
}
cout << "\n\n快速排序\n";
quickSort(data, 0, n - 1, n);
cout << "\n最终排序结果: ";
for (int i = 0; i < n; i++) {
cout << data[i] << " ";
}
cout << endl;
return 0;
}

六、堆排序
先建最大堆,反复将堆顶(最大值)与末尾交换,再调整堆。不稳定。时间复杂度:始终 O(n log n)。空间:O(1)
cpp
#include <iostream>
using namespace std;
// 堆化函数(维护最大堆性质)
void heapify(int arr[], int n, int i, int step) {
int largest = i; // 初始化最大值为根节点
int left = 2 * i + 1;
int right = 2 * i + 2;
// 如果左子节点大于根节点
if (left < n && arr[left] > arr[largest])
largest = left;
// 如果右子节点大于当前最大值
if (right < n && arr[right] > arr[largest])
largest = right;
// 如果最大值不是根节点
if (largest != i) {
int temp = arr[i];
arr[i] = arr[largest];
arr[largest] = temp;
// 递归堆化受影响的子树
heapify(arr, n, largest, step);
}
}
// 堆排序函数
void heapSort(int arr[], int n) {
int step = 1;
// 1. 构建最大堆
cout << "构建最大堆:\n";
for (int i = n / 2 - 1; i >= 0; i--) {
heapify(arr, n, i, step);
cout << " 堆化索引" << i << ": ";
for (int k = 0; k < n; k++) {
cout << arr[k] << " ";
}
cout << endl;
}
cout << "\n最大堆构建完成: ";
for (int k = 0; k < n; k++) {
cout << arr[k] << " ";
}
cout << "\n\n排序过程:\n";
// 2. 一个个从堆中取出元素
for (int i = n - 1; i > 0; i--) {
// 将当前最大值(堆顶)移到数组末尾
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
cout << "第 " << step++ << " 次: 交换堆顶和arr[" << i << "] → ";
for (int k = 0; k < n; k++) {
cout << arr[k] << " ";
}
cout << endl;
// 在减少的堆上重新堆化
heapify(arr, i, 0, step);
cout << " 重新堆化后: ";
for (int k = 0; k < n; k++) {
cout << arr[k] << " ";
}
cout << endl;
}
}
int main() {
int arr[] = {15, 9, 7, 8, 20, -1, 4};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "原始数组: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << "\n\n堆排序\n";
heapSort(arr, n);
cout << "\n最终排序结果: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}