大家好,今天开始给大家每天带来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);
}
标签:index,排序,min,int,length,C++,算法,数据结构
From: https://www.cnblogs.com/DMQDT/p/18088164