一. 冒泡排序
对相邻两个元素的值进行两两比较,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就如水底下的气泡一样逐渐向上冒。
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]) {// 交换 arr[j] 和 arr[j+1]int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}
二. 选择排序
选择排序通过找到数组中的最小(或最大)元素并将其放到排序序列的起始位置来工作
void 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[minIndex] 和 arr[i]int temp = arr[minIndex];arr[minIndex] = arr[i];arr[i] = temp;}
}
三. 插入排序
插入排序通过构建最终排序数组的一部分来工作,每次从未排序的部分取出一个元素并插入到已排序部分的适当位置。
void 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;}
}
四. 快速排序
快速排序是一种高效的排序算法,它使用分治法策略来递归地将数组分成较小的部分来排序。
void quickSort(int arr[], int low, int high) {if (low < high) {int pi = partition(arr, low, high);quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);}
}int partition(int arr[], int low, int high) {int pivot = arr[high];int i = (low - 1);for (int j = low; j <= high - 1; j++) {if (arr[j] < pivot) {i++;// 交换 arr[i] 和 arr[j]int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}// 交换 arr[i+1] 和 arr[high] (或 pivot)int temp = arr[i + 1];arr[i + 1] = arr[high];arr[high] = temp;return (i + 1);
}
五. 堆排序
堆排序使用二叉堆数据结构来排序元素。它首先建立一个最大堆,然后逐步移除最大的元素并重建堆。
void heapify(int arr[], int n, int i) {int largest = i; // 初始化最大值索引int l = 2 * i + 1; // 左子节点int r = 2 * i + 2; // 右子节点// 如果左子节点大于根if (l < n && arr[l] > arr[largest])largest = l;// 如果右子节点大于当前最大值if (r < n && arr[r] > arr[largest])largest = r;// 如果最大值不是根if (largest != i) {int swap = arr[i];arr[i] = arr[largest];arr[largest] = swap;// 递归地堆化受影响的子树heapify(arr, n, largest);}
}void heapSort(int arr[], int n) {// 构建最大堆for (int i = n / 2 - 1; i >= 0; i--)heapify(arr, n, i);// 一个个从堆顶取出元素for (int i = n - 1; i >= 0; i--) {// 将当前根(最大值)移动到数组末尾int temp = arr[0];arr[0] = arr[i];arr[i] = temp;// 调整剩余数组元素,使其成为最大堆heapify(arr, i, 0);}
}
六. 希尔排序
步骤:
1.先选定一个小于N的整数gap作为第一增量,然后将所有距离为gap的元素分在同一组,并对每一组的元素进行直接插入排序。然后再取一个比第一增量小的整数作为第二增量,重复上述操作…
2.当增量的大小减到1时,就相当于整个序列被分到一组,进行一次直接插入排序,排序完成。
//希尔排序
void ShellSort(int* arr, int n)
{int gap = n;while (gap>1){//每次对gap折半操作gap = gap / 2;//单趟排序for (int i = 0; i < n - gap; ++i){int end = i;int tem = arr[end + gap];while (end >= 0){if (tem < arr[end]){arr[end + gap] = arr[end];end -= gap;}else{break;}}arr[end + gap] = tem;}}
}