在数据结构中,排序算法是一个非常重要的概念。排序算法就是将一组无序的数据按照一定的规则排列成有序的数据的过程。在实际应用中,需要根据不同的场景选择相应的排序算法,以满足不同的需求。下面将介绍常见的几种排序算法,并附上对应的C语言代码。
冒泡排序
冒泡排序是一种简单的排序算法。通过不断比较相邻元素的大小关系,将较大或较小的元素逐步移动到列表的末尾或开始位置。该算法的时间复杂度为O(n^2)。
C语言代码:
void bubble_sort(int arr[], int len) {
int i, j, temp;
for (i = 0; i < len - 1; i++) {
for (j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j+1]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
插入排序
插入排序是一种简单而有效的排序算法。它将每一个元素插入到有序序列中的适当位置,最终得到一个完全有序的列表。该算法的时间复杂度为O(n^2)。
C语言代码:
void insertion_sort(int arr[], int len) {
int i, j, temp;
for (i = 1; i < len; i++) {
temp = arr[i];
j = i - 1;
while (j >= 0 && arr[j] > temp) {
arr[j+1] = arr[j];
j--;
}
arr[j+1] = temp;
}
}
选择排序
选择排序是一种简单的排序算法。它不断选择列表中最小或最大的元素,将其与列表中的第一个或最后一个元素交换位置。该算法的时间复杂度为O(n^2)。
C语言代码:
void selection_sort(int arr[], int len) {
int i, j, min_idx, temp;
for (i = 0; i < len - 1; i++) {
min_idx = i;
for (j = i + 1; j < len; j++) {
if (arr[j] < arr[min_idx]) {
min_idx = j;
}
}
temp = arr[i];
arr[i] = arr[min_idx];
arr[min_idx] = temp;
}
}
快速排序
快速排序是一种常用的排序算法。它利用分治策略将一个大序列分成两个小序列进行排序,最终得到一个完全有序的序列。该算法的时间复杂度为O(nlogn)。
C语言代码:
void quick_sort(int arr[], int low, int high) {
if (low < high) {
int i = low, j = high, pivot = arr[low];
while (i < j) {
while (i < j && arr[j] >= pivot) {
j--;
}
if (i < j) {
arr[i++] = arr[j];
}
while (i < j && arr[i] < pivot) {
i++;
}
if (i < j) {
arr[j--] = arr[i];
}
}
arr[i] = pivot;
quick_sort(arr, low, i-1);
quick_sort(arr, i+1, high);
}
}
归并排序
归并排序是一种高效的排序算法。它将一个大序列分成两个小序列进行排序,然后再将两个有序序列归并成一个有序序列。该算法的时间复杂度为O(nlogn)。
C语言代码:
void merge(int arr[], int low, int mid, int high) {
int i = low, j = mid + 1, k = 0;
int tmp[high-low+1];
while (i <= mid && j <= high) {
if (arr[i] <= arr[j]) {
tmp[k++] = arr[i++];
} else {
tmp[k++] = arr[j++];
}
}
while (i <= mid) {
tmp[k++] = arr[i++];
}
while (j <= high) {
tmp[k++] = arr[j++];
}
for (i = low, k = 0; i <= high; i++, k++) {
arr[i] = tmp[k];
}
}
void merge_sort(int arr[], int low, int high) {
if (low < high) {
int mid = (low + high) / 2;
merge_sort(arr, low, mid);
merge_sort(arr, mid+1, high);
merge(arr, low, mid, high);
}
}
希尔排序
希尔排序是一种快速、高效的排序算法,它是插入排序的一种变体。希尔排序的基本思想是将一个序列分成若干个子序列,对每个子序列进行插入排序,然后再将整个序列进行插入排序。希尔排序的时间复杂度为$O(nlogn)$。
希尔排序的实现方式是,先将整个序列分成若干个子序列,对每个子序列进行插入排序。然后,再将整个序列进行插入排序。具体实现过程如下:
- 选择一个增量序列,将序列分成若干个子序列。
- 对每个子序列进行插入排序。
- 逐步缩小增量序列,直到增量为1。
- 对整个序列进行插入排序。
希尔排序的优点是它的时间复杂度为$O(nlogn)$,比插入排序的时间复杂度$O(n^2)$要小,效率较高。此外,希尔排序的实现比较简单,只需要对插入排序进行适当的改进即可。
希尔排序的缺点是它的实现比较复杂,需要选择适当的增量序列。此外,希尔排序并不是稳定的排序算法。如果序列中存在相同的元素,这些元素的相对位置可能会发生改变。
以上介绍的是常用的几种排序算法。在实际应用中,需要根据具体场景来选择合适的排序算法。同时,在编写代码时,需要注意排序算法的时间复杂度,以保证程序的运行效率。