十大排序算法【原理】【步骤】【动图】【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. 桶排序**原理