当前位置:   article > 正文

C语言实现几种常见排序方法_c语言排序输出方法

c语言排序输出方法

目录

一、冒泡排序法

二、选择排序法

三、插入排序法

四、希尔排序法

五、快速排序法

六、归并排序法

七、堆排序法

八、基数排序法

九、桶排序法


一、冒泡排序法

        冒泡排序法的核心思想是比较相邻的元素,如果第一个比第二个大,就交换它们两个。对每一对相邻元素进行比较,将最大或最小的元素移动到数组末尾,直到没有任何一对数字需要比较。

  1. #include <stdio.h>
  2. void bubble_sort(int arr[], int len) {
  3. int i, j, temp;
  4. for (i = 0; i < len - 1; i++) {
  5. for (j = 0; j < len - 1 - i; j++) {
  6. if (arr[j] > arr[j+1]) {
  7. temp = arr[j];
  8. arr[j] = arr[j+1];
  9. arr[j+1] = temp;
  10. }
  11. }
  12. }
  13. }
  14. int main() {
  15. int arr[] = {5, 2, 8, 3, 1};
  16. int len = sizeof(arr) / sizeof(int);
  17. int i;
  18. printf("排序前数组元素为:");
  19. for (i = 0; i < len; i++) {
  20. printf("%d ", arr[i]);
  21. }
  22. printf("\n");
  23. bubble_sort(arr, len);
  24. printf("排序后数组元素为:");
  25. for (i = 0; i < len; i++) {
  26. printf("%d ", arr[i]);
  27. }
  28. printf("\n");
  29. return 0;
  30. }

        使用了一个名为 bubble_sort 的函数,该函数接受一个整型数组 arr 和数组长度 len 作为参数,对数组进行冒泡排序并修改原数组。主函数中定义了一个整型数组 arr,在使用 sizeof 获取数组长度后,调用 bubble_sort 函数对数组进行排序,最后输出排序结果。

二、选择排序法

        选择排序法的核心思想是记录未排序数组的最小值或最大值,将其与无序部分的第一个元素交换位置,直到数组完全有序。其中,一次排序会确定当前无序区内的最小值或最大值,并将该值放置在正确的有序区位置上。

  1. #include <stdio.h>
  2. void selection_sort(int arr[], int len) {
  3. int i, j, temp;
  4. int min_index;
  5. for (i = 0; i < len - 1; i++) {
  6. min_index = i;
  7. for (j = i + 1; j < len; j++) {
  8. if (arr[min_index] > arr[j]) {
  9. min_index = j;
  10. }
  11. }
  12. if (min_index != i) {
  13. temp = arr[i];
  14. arr[i] = arr[min_index];
  15. arr[min_index] = temp;
  16. }
  17. }
  18. }
  19. int main() {
  20. int arr[] = {5, 2, 8, 3, 1};
  21. int len = sizeof(arr) / sizeof(int);
  22. int i;
  23. printf("排序前数组元素为:");
  24. for (i = 0; i < len; i++) {
  25. printf("%d ", arr[i]);
  26. }
  27. printf("\n");
  28. selection_sort(arr, len);
  29. printf("排序后数组元素为:");
  30. for (i = 0; i < len; i++) {
  31. printf("%d ", arr[i]);
  32. }
  33. printf("\n");
  34. return 0;
  35. }

        使用了一个名为 selection_sort 的函数,该函数接受一个整型数组 arr 和数组长度 len 作为参数,对数组进行选择排序并修改原数组。主函数中定义了一个整型数组 arr,在使用 sizeof 获取数组长度后,调用 selection_sort 函数对数组进行排序,最后输出排序结果。

三、插入排序法

        插入排序法的核心思想是将待排序的数组分成两部分:已排序部分和未排序部分。从未排序部分取出第一个元素,与已排序部分从后向前比较,找到其应该插入的位置并插入。重复这个过程,直到未排序部分没有元素。其中,每次排序会将新的元素插入到已排序部分合适的位置,使得已排序部分保持有序。

  1. #include <stdio.h>
  2. void insertion_sort(int arr[], int len) {
  3. int i, j, temp;
  4. for (i = 1; i < len; i++) {
  5. temp = arr[i];
  6. j = i - 1;
  7. while (j >= 0 && arr[j] > temp) {
  8. arr[j+1] = arr[j];
  9. j--;
  10. }
  11. arr[j+1] = temp;
  12. }
  13. }
  14. int main() {
  15. int arr[] = {5, 2, 8, 3, 1};
  16. int len = sizeof(arr) / sizeof(int);
  17. int i;
  18. printf("排序前数组元素为:");
  19. for (i = 0; i < len; i++) {
  20. printf("%d ", arr[i]);
  21. }
  22. printf("\n");
  23. insertion_sort(arr, len);
  24. printf("排序后数组元素为:");
  25. for (i = 0; i < len; i++) {
  26. printf("%d ", arr[i]);
  27. }
  28. printf("\n");
  29. return 0;
  30. }

        使用了一个名为 insertion_sort 的函数,该函数接受一个整型数组 arr 和数组长度 len 作为参数,对数组进行插入排序并修改原数组。主函数中定义了一个整型数组 arr,在使用 sizeof 获取数组长度后,调用 insertion_sort 函数对数组进行排序,最后输出排序结果。

四、希尔排序法

        希尔排序法是插入排序法的改进版本,其核心思想是将数组分割为若干个子序列,分别进行插入排序。通过逐步减小子序列的长度,并不断对整个数组进行插入排序,使得整个数组变得有序。希尔排序法中的增量序列可以设定很多种,如 Shell 增量、Hibbard 增量、Knuth 增量等,通常采用 Shell 增量。

  1. #include <stdio.h>
  2. void shell_sort(int arr[], int len) {
  3. int i, j, gap;
  4. int temp;
  5. for (gap = len / 2; gap > 0; gap /= 2) {
  6. for (i = gap; i < len; i++) {
  7. temp = arr[i];
  8. for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap) {
  9. arr[j+gap] = arr[j];
  10. }
  11. arr[j+gap] = temp;
  12. }
  13. }
  14. }
  15. int main() {
  16. int arr[] = {5, 2, 8, 3, 1};
  17. int len = sizeof(arr) / sizeof(int);
  18. int i;
  19. printf("排序前数组元素为:");
  20. for (i = 0; i < len; i++) {
  21. printf("%d ", arr[i]);
  22. }
  23. printf("\n");
  24. shell_sort(arr, len);
  25. printf("排序后数组元素为:");
  26. for (i = 0; i < len; i++) {
  27. printf("%d ", arr[i]);
  28. }
  29. printf("\n");
  30. return 0;
  31. }

        使用了一个名为 shell_sort 的函数,该函数接受一个整型数组 arr 和数组长度 len 作为参数,对数组进行希尔排序并修改原数组。主函数中定义了一个整型数组 arr,在使用 sizeof 获取数组长度后,调用 shell_sort 函数对数组进行排序,最后输出排序结果。

五、快速排序法

        快速排序法是基于交换的排序算法,它采用了分治的思想。具体来说,每次选择一个基准值,将序列分为两个部分,左边部分都小于等于基准值,右边部分都大于等于基准值。然后递归地分别对左右两边部分进行排序,直到整个序列有序。通常采用双指针法,从左右两边同时向中间扫描找到需要交换的元素,然后进行交换。基准值的选取可以采用多种方式,如取第一个元素、取中间元素、取随机元素等,具体选取方式影响算法的效率。

  1. #include <stdio.h>
  2. void quick_sort(int arr[], int left, int right) {
  3. if (left >= right) {
  4. return;
  5. }
  6. int i = left, j = right;
  7. int pivot = arr[left];
  8. while (i < j) {
  9. while (i < j && arr[j] >= pivot) {
  10. j--;
  11. }
  12. arr[i] = arr[j];
  13. while (i < j && arr[i] <= pivot) {
  14. i++;
  15. }
  16. arr[j] = arr[i];
  17. }
  18. arr[i] = pivot;
  19. quick_sort(arr, left, i-1);
  20. quick_sort(arr, i+1, right);
  21. }
  22. int main() {
  23. int arr[] = {5, 2, 8, 3, 1};
  24. int len = sizeof(arr) / sizeof(int);
  25. int i;
  26. printf("排序前数组元素为:");
  27. for (i = 0; i < len; i++) {
  28. printf("%d ", arr[i]);
  29. }
  30. printf("\n");
  31. quick_sort(arr, 0, len-1);
  32. printf("排序后数组元素为:");
  33. for (i = 0; i < len; i++) {
  34. printf("%d ", arr[i]);
  35. }
  36. printf("\n");
  37. return 0;
  38. }

        使用了一个名为 quick_sort 的函数,该函数接受一个整型数组 arr、左边界 left 和右边界 right 作为参数,对数组进行快速排序并修改原数组。主函数中定义了一个整型数组 arr,在使用 sizeof 获取数组长度后,调用 quick_sort 函数对数组进行排序,最后输出排序结果。

六、归并排序法

        归并排序法是基于比较的稳定排序算法,采用了分治的思想。具体来说,将待排序序列逐层划分为若干个子序列,每个子序列都是有序的,然后将相邻两个子序列进行合并,直到整个序列有序。合并过程中需要用到一个额外的数组来存储归并后的结果,最后将排序好的结果赋值给原数组。原始序列被均分成两个长度相等的子序列,直到子序列长度为1,然后将相邻两个子序列进行合并。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void merge(int arr[], int left, int mid, int right) {
  4. int i = left, j = mid+1, k = 0;
  5. int* temp = (int*) malloc(sizeof(int) * (right-left+1));
  6. while (i <= mid && j <= right) {
  7. if (arr[i] <= arr[j]) {
  8. temp[k++] = arr[i++];
  9. } else {
  10. temp[k++] = arr[j++];
  11. }
  12. }
  13. while (i <= mid) {
  14. temp[k++] = arr[i++];
  15. }
  16. while (j <= right) {
  17. temp[k++] = arr[j++];
  18. }
  19. for (i = left, k = 0; i <= right; i++, k++) {
  20. arr[i] = temp[k];
  21. }
  22. free(temp);
  23. }
  24. void merge_sort(int arr[], int left, int right) {
  25. if (left >= right) {
  26. return;
  27. }
  28. int mid = left + (right - left) / 2;
  29. merge_sort(arr, left, mid);
  30. merge_sort(arr, mid+1, right);
  31. merge(arr, left, mid, right);
  32. }
  33. int main() {
  34. int arr[] = {5, 2, 8, 3, 1};
  35. int len = sizeof(arr) / sizeof(int);
  36. int i;
  37. printf("排序前数组元素为:");
  38. for (i = 0; i < len; i++) {
  39. printf("%d ", arr[i]);
  40. }
  41. printf("\n");
  42. merge_sort(arr, 0, len-1);
  43. printf("排序后数组元素为:");
  44. for (i = 0; i < len; i++) {
  45. printf("%d ", arr[i]);
  46. }
  47. printf("\n");
  48. return 0;
  49. }

        该程序使用了一个名为 merge 的函数,该函数接受一个整型数组 arr、左边界 left、中间位置 mid 和右边界 right 作为参数,对数组的左半部分和右半部分进行归并排序并修改原数组。在归并排序过程中,需要用到一个额外的数组来存储排序过程中产生的临时结果。主函数中定义了一个整型数组 arr,在使用 sizeof 获取数组长度后,调用 merge_sort 函数对数组进行排序,最后输出排序结果。

七、堆排序法

        堆排序法是基于比较的不稳定排序算法,采用了大根堆(或小根堆)的数据结构来实现。首先将待排序序列建立成大根堆(或小根堆),然后将根节点与最后一个节点交换位置,这时候最后一个节点已经是有序的了,再对剩余部分的序列进行堆化,得到新的根节点,再将根节点与倒数第二个节点交换位置,以此类推,不断缩小排序范围,直到整个序列有序。堆排序需要额外的空间来存储堆结构,且常数因子较大。

  1. #include <stdio.h>
  2. void heapify(int arr[], int n, int i) {
  3. int largest = i;
  4. int l = 2*i+1, r = 2*i+2;
  5. if (l < n && arr[l] > arr[largest]) {
  6. largest = l;
  7. }
  8. if (r < n && arr[r] > arr[largest]) {
  9. largest = r;
  10. }
  11. if (largest != i) {
  12. int temp = arr[i];
  13. arr[i] = arr[largest];
  14. arr[largest] = temp;
  15. heapify(arr, n, largest);
  16. }
  17. }
  18. void heap_sort(int arr[], int n) {
  19. int i;
  20. for (i = n/2-1; i >= 0; i--) {
  21. heapify(arr, n, i);
  22. }
  23. for (i = n-1; i >= 0; i--) {
  24. int temp = arr[0];
  25. arr[0] = arr[i];
  26. arr[i] = temp;
  27. heapify(arr, i, 0);
  28. }
  29. }
  30. int main() {
  31. int arr[] = {5, 2, 8, 3, 1};
  32. int len = sizeof(arr) / sizeof(int);
  33. int i;
  34. printf("排序前数组元素为:");
  35. for (i = 0; i < len; i++) {
  36. printf("%d ", arr[i]);
  37. }
  38. printf("\n");
  39. heap_sort(arr, len);
  40. printf("排序后数组元素为:");
  41. for (i = 0; i < len; i++) {
  42. printf("%d ", arr[i]);
  43. }
  44. printf("\n");
  45. return 0;
  46. }

        使用了一个名为 heapify 的函数和一个名为 heap_sort 的函数,分别对整型数组进行堆化和堆排序。在堆化过程中,需要通过递归地调用该函数来维护大根堆的性质;在堆排序过程中,需要先将整个数组堆化,然后逐步将最大值交换到数组末尾,并重新堆化剩余部分的数组。主函数中定义了一个整型数组 arr,在使用 sizeof 获取数组长度后,调用 heap_sort 函数对数组进行排序,最后输出排序结果。

八、基数排序法

        基数排序是一种非比较排序算法,采用了将数据按照位来比较的策略,由低位到高位依次对数据进行排序。它需要使用到计数排序或桶排序等线性时间复杂度的辅助排序算法,而且需要数据具有一定的范围限制和可比性。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int get_digit(int num, int radix) {
  4. int digit = 1;
  5. while ((num /= radix) > 0) {
  6. digit++;
  7. }
  8. return digit;
  9. }
  10. int get_num_at_digit(int num, int digit, int radix) {
  11. int i;
  12. for (i = 1; i < digit; i++) {
  13. num /= radix;
  14. }
  15. return num % radix;
  16. }
  17. void radix_sort(int arr[], int n, int radix) {
  18. int i, j, k, digit, max_digit = 0;
  19. int* count = (int*) malloc(sizeof(int) * radix);
  20. int* bucket = (int*) malloc(sizeof(int) * n);
  21. for (i = 0; i < n; i++) {
  22. digit = get_digit(arr[i], radix);
  23. if (digit > max_digit) {
  24. max_digit = digit;
  25. }
  26. }
  27. for (k = 1; k <= max_digit; k++) {
  28. for (i = 0; i < radix; i++) {
  29. count[i] = 0;
  30. }
  31. for (i = 0; i < n; i++) {
  32. digit = get_num_at_digit(arr[i], k, radix);
  33. count[digit]++;
  34. }
  35. for (i = 1; i < radix; i++) {
  36. count[i] += count[i-1];
  37. }
  38. for (i = n-1; i >= 0; i--) {
  39. digit = get_num_at_digit(arr[i], k, radix);
  40. bucket[--count[digit]] = arr[i];
  41. }
  42. for (i = 0; i < n; i++) {
  43. arr[i] = bucket[i];
  44. }
  45. }
  46. free(count);
  47. free(bucket);
  48. }
  49. int main() {
  50. int arr[] = {35, 28, 98, 45, 67, 23, 10};
  51. int len = sizeof(arr) / sizeof(int);
  52. int i;
  53. printf("排序前数组元素为:");
  54. for (i = 0; i < len; i++) {
  55. printf("%d ", arr[i]);
  56. }
  57. printf("\n");
  58. radix_sort(arr, len, 10);
  59. printf("排序后数组元素为:");
  60. for (i = 0; i < len; i++) {
  61. printf("%d ", arr[i]);
  62. }
  63. printf("\n");
  64. return 0;
  65. }

        该程序使用了一个名为 get_digit 的函数和一个名为 get_num_at_digit 的函数,分别用于获取一个整数的位数及某一位的数字;还使用了一个名为 radix_sort 的函数,基于计数排序的思想实现基数排序。在基数排序过程中,需要将待排序序列按照位数从低到高依次进行排序,每次排序需要使用计数排序对相应位上的数字进行排序。主函数中定义了一个整型数组 arr,在使用 sizeof 获取数组长度后,调用 radix_sort 函数对数组进行排序,最后输出排序结果。

九、桶排序法

        桶排序是一种常用的排序算法,它需要根据数据的特点构建若干个桶,将数据分配到相应的桶中并对每个桶中的数据进行排序,最后按照桶的顺序依次输出所有数据。桶排序具有线性时间复杂度,但需要额外的存储空间来存放桶。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void bucket_sort(int arr[], int n, int bucketSize) {
  4. int i, j, k;
  5. int* bucket;
  6. if (bucketSize <= 0) {
  7. return;
  8. }
  9. int min_value = arr[0], max_value = arr[0];
  10. for (i = 1; i < n; i++) {
  11. if (arr[i] < min_value) {
  12. min_value = arr[i];
  13. } else if (arr[i] > max_value) {
  14. max_value = arr[i];
  15. }
  16. }
  17. int bucket_count = (max_value - min_value) / bucketSize + 1;
  18. bucket = (int*) malloc(sizeof(int) * bucket_count);
  19. for (i = 0; i < bucket_count; i++) {
  20. bucket[i] = 0;
  21. }
  22. for (i = 0; i < n; i++) {
  23. bucket[(arr[i] - min_value) / bucketSize]++;
  24. }
  25. for (i = 1; i < bucket_count; i++) {
  26. bucket[i] += bucket[i-1];
  27. }
  28. int* results = (int*) malloc(sizeof(int) * n);
  29. for (i = n-1; i >= 0; i--) {
  30. j = (arr[i] - min_value) / bucketSize;
  31. results[--bucket[j]] = arr[i];
  32. }
  33. for (i = 0; i < n; i++) {
  34. arr[i] = results[i];
  35. }
  36. free(bucket);
  37. free(results);
  38. }
  39. int main() {
  40. int arr[] = {35, 28, 98, 45, 67, 23, 10};
  41. int len = sizeof(arr) / sizeof(int);
  42. int i;
  43. printf("排序前数组元素为:");
  44. for (i = 0; i < len; i++) {
  45. printf("%d ", arr[i]);
  46. }
  47. printf("\n");
  48. bucket_sort(arr, len, 10);
  49. printf("排序后数组元素为:");
  50. for (i = 0; i < len; i++) {
  51. printf("%d ", arr[i]);
  52. }
  53. printf("\n");
  54. return 0;
  55. }

        使用了一个名为 bucket_sort 的函数来实现桶排序。在桶排序过程中,需要将待排序序列分配到若干个桶中,然后对每个桶中的数据进行排序,最后按照桶的顺序依次输出所有数据。主函数中定义了一个整型数组 arr,在使用 sizeof 获取数组长度后,调用 bucket_sort 函数对数组进行排序,最后输出排序结果。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/278229
推荐阅读
相关标签
  

闽ICP备14008679号