根据给定文件的信息,本文将详细介绍C语言中的几种常用排序算法,包括冒泡排序、选择排序、插入排序、快速排序以及希尔排序。
### 一、冒泡排序(Bubble Sort)
冒泡排序是一种简单的排序算法。它重复地遍历待排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换的元素为止,也就是说该数列已经排序完成。
**代码示例:**
```cpp
void bubble_sort(int a[], int n) {
int i, j, temp;
for (i = 0; i < n - 1; i++)
for (j = i + 1; j < n; j++)
if (a[i] > a[j]) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
print(a, n);
}
```
### 二、选择排序(Selection Sort)
选择排序是一种简单直观的排序算法。它的基本思想是从待排序的数据元素中选出最小或最大元素,存放在序列的起始位置,然后再从剩余未排序元素中继续寻找最小或最大元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
**代码示例:**
```cpp
void select_sort(int a[], int n) {
int i, j, k, temp;
for (i = 0; i < n - 1; i++) {
k = i;
for (j = i + 1; j < n; j++)
if (a[k] > a[j])
k = j; // k 指向最小元素
if (i != k) { // 如果 k 不等于 i,则交换 a[i] 和最小值
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}
cout << "选";
print(a, n);
}
```
### 三、插入排序(Insertion Sort)
插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从序列的部分有序状况下,可以提高其效率。
**代码示例:**
```cpp
void insert_sort(int a[], int n) {
int i, j, temp;
for (i = 1; i < n; i++) { // 从第二个元素开始
temp = a[i]; // temp 存储当前元素
j = i - 1;
while (j >= 0 && temp < a[j]) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = temp;
}
cout << "插";
print(a, n);
}
```
### 四、快速排序(Quick Sort)
快速排序是一种高效的排序算法,采用分治法策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。步骤如下:
1. 从数列中挑出一个元素,称为“基准”。
2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分割操作。
3. 递归地将小于基准值元素的子数列和大于基准值元素的子数列排序。
**代码示例:**
```cpp
void quick_sort(int a[], int i, int j) {
int m, n, temp, k;
m = i, n = j;
k = a[(i + j) / 2];
do {
while (a[m] < k && m < j) m++; // 寻找比基准大的元素
while (a[n] > k && n > i) n--; // 寻找比基准小的元素
if (m <= n) { // 两元素相遇
temp = a[m];
a[m] = a[n];
a[n] = temp;
m++;
n--;
}
} while (m <= n);
if (m < j) quick_sort(a, m, j); // 排序右侧数组
if (n > i) quick_sort(a, i, n); // 排序左侧数组
}
```
### 五、希尔排序(Shell Sort)
希尔排序是基于插入排序的一种更高效的改进版本。它与普通插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序是不稳定排序算法。
**算法步骤:**
1. 选择一个增量序列 t1, t2, ..., tk, 其中 ti > tj, tk = 1;
2. 按增量序列个数 k,对序列进行 k 趟排序;
3. 每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
**代码示例:**
```cpp
void shell_sort(int a[], int n) {
int i, j, k, temp;
k = n / 2; // 增量
while (k >= 1) {
for (i = k; i < n; i++) {
temp = a[i];
j = i - k;
while (j >= 0 && temp < a[j]) {
a[j + k] = a[j];
j = j - k;
}
a[j + k] = temp;
}
k /= 2;
}
cout << "希尔";
print(a, n);
}
```
以上就是几种常用的排序算法及其C语言实现方式。这些算法各有优缺点,在实际应用中应根据具体情况选择合适的算法。