数据结构中的常用排序算法【C语言实现】

本文介绍了几种常见的排序算法,包括冒泡排序、插入排序、选择排序、快速排序、归并排序和希尔排序,详细阐述了每种算法的工作原理,并提供了相应的C语言实现代码。同时,提到了不同排序算法的时间复杂度,帮助读者理解如何根据需求选择合适的排序方法。
摘要由CSDN通过智能技术生成

在数据结构中,排序算法是一个非常重要的概念。排序算法就是将一组无序的数据按照一定的规则排列成有序的数据的过程。在实际应用中,需要根据不同的场景选择相应的排序算法,以满足不同的需求。下面将介绍常见的几种排序算法,并附上对应的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. 选择一个增量序列,将序列分成若干个子序列。
  2. 对每个子序列进行插入排序。
  3. 逐步缩小增量序列,直到增量为1。
  4. 对整个序列进行插入排序。

希尔排序的优点是它的时间复杂度为$O(nlogn)$,比插入排序的时间复杂度$O(n^2)$要小,效率较高。此外,希尔排序的实现比较简单,只需要对插入排序进行适当的改进即可。

希尔排序的缺点是它的实现比较复杂,需要选择适当的增量序列。此外,希尔排序并不是稳定的排序算法。如果序列中存在相同的元素,这些元素的相对位置可能会发生改变。

以上介绍的是常用的几种排序算法。在实际应用中,需要根据具体场景来选择合适的排序算法。同时,在编写代码时,需要注意排序算法的时间复杂度,以保证程序的运行效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

往日无痕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值