C++版数据结构与算法

    大家好,今天开始给大家每天带来C++版的数据结构与算法,后面也会包括C#的系统学习。

   这段代码是一个C++实现的排序算法集合。其中包括选择排序(selection sort)、冒泡排序(bubble sort)、插入排序(insertion sort)和归并排序(merge sort)。算法后越往后越难,此次做这个系列博客,是想从基础算法开始逐步上升到高阶算法。

   为了让大家更好的理解算法的执行过程,给大家安利一个网站(visualgo),https://visualgo.net/en,这个网站时免费的,有不懂的地方可以去上面看算法的执行过程。如果大家还是有不懂的地方,可以评论和私信我,我会尽我所能帮助大家把算法搞懂。
#include<iostream>
using namespace std;
int a[111000];
/*
	交换数组a中下标为firstIndex和secondIndex位置的元素
*/
void swap(int a[], int firstIndex, int secondIndex) {
    int i = a[firstIndex];
    a[firstIndex] = a[secondIndex];
    a[secondIndex] = i;
}
/*
	选择排序:
	每次从未排序的部分选择一个最小的元素,放到已排序部分的末尾。
*/
void selectionSort(int a[], int length) {
    for (int i = 0; i < length - 1; i++) {
        int min_index = i;
        for (int j = i + 1; j < length; j++) {
            if (a[j] < a[min_index]) {
                min_index = j;
            }
        }
        swap(a, i, min_index);
    }
}
/*
	冒泡排序:
    依次比较相邻的两个元素,将较大的元素逐渐交换到后面,每次外层循环完成时将剩下的元素中最大的元素归位。
*/
void bubbleSort(int a[], int length) {
    for (int i = 0; i < length; i++) {
        for (int j = length - 1; j > 0; j--) {
            if (a[j] < a[j - 1]) {
                swap(a, j, j - 1);
            }
        }
    }
}
/*
	插入排序:
	将未排序的元素一个一个插入到已排序的部分中,插入时比较大小并移动元素位置。
*/
void insertionSort(int a[], int length) {
    for (int i = 0; i < length; i++) {
        int min_index = i;
        for (int j = i; j < length; j++) {
            min_index = a[j] < a[min_index] ? j : min_index;
        }
        swap(a, i, min_index);
    }
}
/*
	归并排序:
	将数组分为两部分,分别排序后再合并。合并时依次比较两个子数组的元素,并将较小的元素放入临时数组中,最后将临时数组的元素复制回原数组。
*/
void merge(int a[], int l, int m, int r) {
    int len = r - l + 1;
    int help[len];
    int i = 0;
    int p1 = l;
    int p2 = m + 1;
    while (p1 <= m && p2 <= r) {
        help[i++] = a[p1] <= a[p2] ? a[p1++] : a[p2++];
    }
    while (p1 <= m) {
        help[i++] = a[p1++];
    }
    while (p2 <= r) {
        help[i++] = a[p2++];
    }
    for (i = 0; i < len; i++) {
        a[l + i] = help[i];
    }
}

void mergeSort(int a[], int l, int r) {
    if (l == r) {
        return;
    }
    int mid = l + ((r - l) >> 1);
    mergeSort(a, l, mid);
    mergeSort(a, mid + 1, r);
    merge(a, l, mid, r);

}
posted @ 2024-03-21 20:10  smallwhite-dragon  阅读(5)  评论(0编辑  收藏  举报