当前位置:实例文章 » 其他实例» [文章]十大排序算法【原理】【步骤】【动图】【C++实现】

十大排序算法【原理】【步骤】【动图】【C++实现】

发布人:shili8 发布时间:2024-11-14 15:16 阅读次数:0

**十大排序算法**

排序算法是计算机科学中一个非常重要的概念,它们用于将数据按一定顺序排列,使得数据变得有序、可管理。以下是十大排序算法的原理、步骤、动图和C++实现。

###1. 冒泡排序**原理:** 冒泡排序是一种简单的交换排序算法,它通过反复地遍历列表,相邻元素之间进行比较,如果两个相邻元素的顺序错误,则将它们交换位置,以此达到让数据有序的目的。

**步骤:**

1. 从头到尾遍历列表。
2. 如果当前元素与下一个元素的顺序错误,则交换他们。
3. 重复步骤1 和2,直到列表有序。

**动图:** [冒泡排序动画]( />
**C++实现:**

cppvoid 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]) {
 // 交换 arr[j] 和 arr[j +1]
 int temp = arr[j];
 arr[j] = arr[j +1];
 arr[j +1] = temp;
 }
 }
 }
}

###2.选择排序**原理:**选择排序是一种简单的交换排序算法,它通过反复地遍历列表,找出最小或最大元素,并将其放在列表的起始位置。

**步骤:**

1. 从头到尾遍历列表。
2. 找出当前元素与其他元素之间的最小或最大值,并交换它们。
3. 重复步骤1 和2,直到列表有序。

**动图:** [选择排序动画]( />
**C++实现:**
cppvoid 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;
 }
 }
 // 交换 arr[i] 和 arr[minIndex]
 int temp = arr[i];
 arr[i] = arr[minIndex];
 arr[minIndex] = temp;
 }
}

###3. 插入排序**原理:** 插入排序是一种简单的交换排序算法,它通过反复地遍历列表,找到每个元素的正确位置,并将其插入到该位置。

**步骤:**

1. 从头到尾遍历列表。
2. 找出当前元素的正确位置,并将其插入到该位置。
3. 重复步骤1 和2,直到列表有序。

**动图:** [插入排序动画]( />
**C++实现:**
cppvoid insertionSort(int arr[], int n) {
 for (int i =1; i < n; i++) {
 int key = arr[i];
 int j = i -1;
 while (j >=0 && arr[j] > key) {
 // 移动元素 arr[j +1] = arr[j];
 j--;
 }
 // 插入元素 arr[j +1] = key;
 }
}

###4. 归并排序**原理:** 归并排序是一种分治法的排序算法,它通过反复地将列表分成两半,并对每半进行归并,直到列表有序。

**步骤:**

1. 将列表分成两半。
2. 对每半进行归并。
3. 重复步骤1 和2,直到列表有序。

**动图:** [归并排序动画]( />
**C++实现:**
cppvoid mergeSort(int arr[], int n) {
 if (n <=1) return;
 int mid = n /2;
 // 分成两半 int left[mid];
 int right[n - mid];
 for (int i =0; i < mid; i++) {
 left[i] = arr[i];
 }
 for (int i = mid; i < n; i++) {
 right[i - mid] = arr[i];
 }
 // 归并 merge(left, right, arr);
}

void merge(int left[], int right[], int arr[]) {
 int i =0;
 int j =0;
 int k =0;
 while (i < sizeof(left) && j < sizeof(right)) {
 if (left[i] <= right[j]) {
 arr[k++] = left[i++];
 } else {
 arr[k++] = right[j++];
 }
 }
 // 将剩余元素复制到 arr 中 while (i < sizeof(left)) {
 arr[k++] = left[i++];
 }
 while (j < sizeof(right)) {
 arr[k++] = right[j++];
 }
}

###5. 快速排序**原理:** 快速排序是一种分治法的排序算法,它通过反复地将列表分成两半,并对每半进行快速排序,直到列表有序。

**步骤:**

1. 将列表分成两半。
2. 对每半进行快速排序。
3. 重复步骤1 和2,直到列表有序。

**动图:** [快速排序动画]( />
**C++实现:**
cppvoid quickSort(int arr[], int n) {
 if (n <=1) return;
 int pivot = arr[0];
 int left[n -1];
 int right[n -1];
 for (int i =1; i < n; i++) {
 if (arr[i] <= pivot) {
 // 将小于等于 pivot 的元素放入左半 left[i -1] = arr[i];
 } else {
 // 将大于 pivot 的元素放入右半 right[i -1] = arr[i];
 }
 }
 // 对左半进行快速排序 quickSort(left, n -1);
 // 对右半进行快速排序 quickSort(right, n -1);
}

###6. 堆排序**原理:** 堆排序是一种分治法的排序算法,它通过反复地将列表分成两半,并对每半进行堆化,直到列表有序。

**步骤:**

1. 将列表分成两半。
2. 对每半进行堆化。
3. 重复步骤1 和2,直到列表有序。

**动图:** [堆排序动画]( />
**C++实现:**
cppvoid heapify(int arr[], int n) {
 for (int i = n /2; i >=0; i--) {
 // 堆化 arr[i] 到 arr[0]
 heapifyHelper(arr, n, i);
 }
}

void heapifyHelper(int arr[], int n, int i) {
 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) {
 // 交换 arr[i] 和 arr[largest]
 int temp = arr[i];
 arr[i] = arr[largest];
 arr[largest] = temp;
 // 堆化 arr[largest]
 heapifyHelper(arr, n, largest);
 }
}

void heapSort(int arr[], int n) {
 heapify(arr, n);
 for (int i = n -1; i >=0; i--) {
 // 交换 arr[0] 和 arr[i]
 int temp = arr[0];
 arr[0] = arr[i];
 arr[i] = temp;
 // 堆化 arr[0]
 heapifyHelper(arr, i,0);
 }
}

###7. 桶排序**原理

相关标签:算法排序算法
其他信息

其他资源

Top