本文共 2617 字,大约阅读时间需要 8 分钟。
插入排序是一种简单而有效的排序算法,其思想是将一条记录插入到已排序的表中,使之保持有序。
直接插入排序是一种最常用的插入排序方法。
算法思想:逐步将记录插入到已排好序的有序表中。
实现代码:
void InsertSort(int a[], int n) { int i, j, t; // 从第二个元素开始插入 for (i = 2; i <= n; i++) { // 插入的位置 if (a[i-1] > a[i]) { // 交换中间变量 t = a[i]; // 将要插入的元素向左移动 for (j = i-1; a[j] > t; j--) { a[j+1] = a[j]; } a[j+1] = t; } }} 与直接插入排序相比,折半插入排序在插入位置的选择上更优。
算法思想:采用折半查找法确定插入位置。
实现代码:
void BInsertSort(int a[], int n) { int i, j, t; int low, high, mid; // 控制循环的趟数,每一趟采用折半查找 for (i = 2; i <= n; i++) { a[0] = a[i]; low = 1; high = i - 1; while (low <= high) { mid = (low + high) / 2; if (a[mid] >= a[0]) { high = mid - 1; } else { low = mid + 1; } } // 移动记录到正确位置 for (j = i-1; j >= high + 1; j--) { a[j+1] = a[j]; } a[high+1] = a[0]; }} 起泡排序是一种简单的稳定排序算法,逐步将较大的元素“冒泡”到已排序的位置。
算法思想:从前向后依次检查每一对相邻元素,发现逆序后交换位置。
实现代码:
void BubSort(int a[], int n) { int i, j, t; // 控制循环的趟数 for (i = 1; i < n; i++) { // 配对检查的范围逐渐缩小 for (j = 1; j <= n - i; j++) { if (a[j] > a[j+1]) { t = a[j]; a[j] = a[j+1]; a[j+1] = t; } } }} 快速排序是一种高效的分治排序算法,通过一次排序将记录分割成两部分。
算法思想:选择一个记录作为枢轴,将数组划分为两部分,分别对每一部分递归排序。
实现代码:
// 第一趟排序int Partition(int a[], int low, int high) { int pkey = a[low]; while (low < high) { while (a[high] >= pkey && low < high) { high--; } a[low] = a[high]; while (a[low] < pkey && low < high) { low++; } a[high] = a[low]; } a[low] = pkey; return low;}// 递归排序void QSort(int a[], int low, int high) { if (low < high) { int mid = Partition(a, low, high); QSort(a, low, mid - 1); QSort(a, mid + 1, high); }}// 适用于数组从索引1开始void QuickSort(int a[], int n) { QSort(a, 1, n);} 简单选择排序是一种稳定排序算法,通过每次选取最小记录来逐步建立排序。
算法思想:
实现代码:
void SelectSort(int a[], int n) { int i, j; int min, t; // 第一趟:找最小值放第一位 for (i = 1; i < n; i++) { min = a[i]; for (j = i+1; j < n; j++) { if (a[j] < min) { min = a[j]; } } for (j = i+1; j >= (a[i] = min); j--) { t = a[j]; a[j] = a[j-1]; a[j-1] = t; } }} 通过以上各算法的理解和实现,可以方便地对不同数据量和规模的数据进行排序处理。
转载地址:http://vytpz.baihongyu.com/