掌握C++中的常用排序算法

常用排序算法介绍

排序算法是计算机科学中的基础算法之一。常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、归并排序等。在本文中,我们将介绍 C++ 中的常用排序算法及其实现。

冒泡排序

算法原理

冒泡排序是一种简单的排序算法。它会多次遍历待排序的数组,每次比较相邻的两个元素,如果顺序不对则交换它们的位置,直到所有元素都排好序。

以下是冒泡排序的 C++ 实现:

void bubbleSort(int arr[], int n){

for (int i = 0; i < n-1; i++){

for (int j = 0; j < n-i-1; j++){

if (arr[j] > arr[j+1]){

swap(arr[j], arr[j+1]);

}

}

}

}

冒泡排序的时间复杂度为 O(n^2)。

选择排序

算法原理

选择排序是一种简单的排序算法。它会首先在待排序的数组中找到最小的元素,将其放在第一个位置,然后在剩余的元素中再找到最小的元素,放在第二个位置,依此类推。

以下是选择排序的 C++ 实现:

void selectionSort(int arr[], int n){

int minIndex;

for (int i = 0; i < n-1; i++){

minIndex = i;

for (int j = i+1; j < n; j++){

if (arr[j] < arr[minIndex]){

minIndex = j;

}

}

swap(arr[i], arr[minIndex]);

}

}

选择排序的时间复杂度为 O(n^2)。

插入排序

算法原理

插入排序是一种简单的排序算法。它会将待排序的数组分为已排序和未排序两部分,首先将第一个元素看作已排序部分,然后将后面的元素一个一个地插入到已排序部分中,直到所有元素都排好序。

以下是插入排序的 C++ 实现:

void insertionSort(int arr[], int n){

int j, temp;

for (int i = 1; i < n; i++){

j = i-1;

temp = arr[i];

while (j >= 0 && arr[j] > temp){

arr[j+1] = arr[j];

j--;

}

arr[j+1] = temp;

}

}

插入排序的时间复杂度为 O(n^2)。

快速排序

算法原理

快速排序是一种常用的排序算法。它的核心思想是选择一个基准元素,将后面的元素分为两部分,一部分是小于基准元素的,另一部分是大于基准元素的,然后递归地对这两部分元素进行排序。

以下是快速排序的 C++ 实现:

void quickSort(int arr[], int left, int right){

int i, j, pivot;

if (left < right){

i = left;

j = right;

pivot = arr[left];

while (i < j){

while (i < j && arr[j] >= pivot){

j--;

}

if (i < j){

arr[i++] = arr[j];

}

while (i < j && arr[i] <= pivot){

i++;

}

if (i < j){

arr[j--] = arr[i];

}

}

arr[i] = pivot;

quickSort(arr, left, i-1);

quickSort(arr, i+1, right);

}

}

快速排序的时间复杂度为 O(nlogn)。

归并排序

算法原理

归并排序是一种常用的排序算法。它的核心思想是将一个数组分成两部分,分别对这两部分进行排序,然后将这两部分再合并起来。具体而言,它将待排序数组不断地对半划分,直到每个子数组都只有一个元素,然后将这些子数组两两合并,直到最终只剩下一个完整的有序数组。

以下是归并排序的 C++ 实现:

void merge(int arr[], int left, int mid, int right){

int i, j, k;

int n1 = mid - left + 1;

int n2 = right - mid;

int L[n1], R[n2];

for (i = 0; i < n1; i++){

L[i] = arr[left+i];

}

for (j = 0; j < n2; j++){

R[j] = arr[mid+1+j];

}

i = 0;

j = 0;

k = left;

while (i < n1 && j < n2){

if (L[i] <= R[j]){

arr[k++] = L[i++];

}

else{

arr[k++] = R[j++];

}

}

while (i < n1){

arr[k++] = L[i++];

}

while (j < n2){

arr[k++] = R[j++];

}

}

void mergeSort(int arr[], int left, int right){

if (left < right){

int mid = left + (right-left)/2;

mergeSort(arr, left, mid);

mergeSort(arr, mid+1, right);

merge(arr, left, mid, right);

}

}

归并排序的时间复杂度为 O(nlogn)。

总结

本文介绍了 C++ 中常用的排序算法及其实现,这些算法包括冒泡排序、选择排序、插入排序、快速排序和归并排序。这些排序算法各有优缺点,各有适应场景。在实际应用中,我们可以根据需要选择合适的排序算法。

后端开发标签