排序算法比较

排序算法

一、插入排序

将当前元素插入到前面已排序序列的合适位置。稳定。时间复杂度:平均 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;
}
相关推荐
吴可可1235 小时前
用Teigha修改并保存CAD文件
数据库·算法·c#
汉克老师6 小时前
GESP6级C++考试语法知识(十七、数据结构(三、认识队列 Queue))
数据结构·c++·队列·gesp6级·gesp六级·数组模拟队列
灰灰勇闯IT6 小时前
ops-reduce:ReduceMax 与 ReduceMean 的并行优化
算法
水木流年追梦6 小时前
大模型入门-Reward 奖励模型训练
开发语言·python·算法·leetcode·正则表达式
JavaWeb学起来6 小时前
Python学习教程(六)数据结构List(列表)
数据结构·python·python基础·python教程
沙威玛_LHE6 小时前
P13376题解
算法
DFT计算杂谈7 小时前
KPROJ编译教程
java·前端·python·算法·conda
重生之我是Java开发战士7 小时前
【笔试强训】Week5:空调遥控, kotor和气球,走迷宫,主持人调度II,体操队形,二叉树的最大路径和,排序子序列,消减整数
java·算法·动态规划
吃好睡好便好8 小时前
用if…end…语句计算分段函数
开发语言·人工智能·学习·算法·matlab