常用排序算法

蔚落 2022-04-16 04:49 286阅读 0赞
  1. 插入排序:
  1. #include "main.h"
  2. void insertSort(int *data, int length)
  3. {
  4. int pos, i , temp;
  5. for (pos = 1; pos < length; pos++)
  6. {
  7. temp = data[pos];
  8. for (i = pos - 1; i >= 0; i--)
  9. {
  10. if (temp < data[i])
  11. {
  12. data[i + 1] = data[i];
  13. if (0 == i)
  14. {
  15. data[0] = temp;
  16. break;
  17. }
  18. }
  19. else
  20. {
  21. data[i + 1] = temp;
  22. break;
  23. }
  24. }
  25. }
  26. }

2. 选择排序:

  1. #include "main.h"
  2. void selectSort(int *data, int length)
  3. {
  4. int max, pos, i;
  5. for (pos = length - 1; pos > 0; pos--)
  6. {
  7. max = 0;
  8. for (i = 1; i <= pos; i++)
  9. {
  10. if (data[max] < data[i])
  11. {
  12. max = i;
  13. }
  14. }
  15. if (max != pos)
  16. {
  17. swap(data, max, pos);
  18. }
  19. }
  20. }

3. 冒泡排序:

  1. #include "main.h"
  2. void popSort(int *data, int length)
  3. {
  4. int pos, i;
  5. for (pos = length - 1; pos >= 1; pos--)
  6. {
  7. for (i = 0; i < pos; i++)
  8. {
  9. if (data[i] > data[i + 1])
  10. {
  11. swap (data, i, i + 1);
  12. }
  13. }
  14. }
  15. }

4. 快速排序:

  1. #include "main.h"
  2. /**
  3. * Partition of the quickSort
  4. */
  5. int partition(int *data, int start, int end)
  6. {
  7. int i = start + 1, j = end;
  8. if (start >= end)
  9. {
  10. return start;
  11. }
  12. while (1)
  13. {
  14. while (i <= j && data[start] >= data[i])
  15. {
  16. i++;
  17. }
  18. while (i <= j && data[start] < data[j])
  19. {
  20. j--;
  21. }
  22. if (i < j)
  23. {
  24. swap(data, i, j);
  25. }
  26. else
  27. {
  28. swap(data, start, j);
  29. return j;
  30. }
  31. }
  32. }
  33. void quickSort(int *data, int start, int end)
  34. {
  35. int pos;
  36. if (start >= end)
  37. {
  38. return;
  39. }
  40. pos = partition(data, start, end);
  41. quickSort(data, start, pos - 1);
  42. quickSort(data, pos + 1, end);
  43. }

5. 归并排序:

  1. #include "main.h"
  2. void merge(int *data, int start, int middle, int end)
  3. {
  4. int i = start, j = middle + 1;
  5. int pos = 0;
  6. int *temp = NULL;
  7. if (start >= end)
  8. {
  9. return;
  10. }
  11. temp = (int *)malloc((end - start + 1) * sizeof(int));
  12. while (i <= middle && j <= end)
  13. {
  14. temp[pos++] = data[i] <= data[j] ? data[i++] : data[j++];
  15. }
  16. while (i <= middle)
  17. {
  18. temp[pos++] = data[i++];
  19. }
  20. while (j <= end)
  21. {
  22. temp[pos++] = data[j++];
  23. }
  24. pos = 0;
  25. while (pos < end - start + 1)
  26. {
  27. data[start + pos] = temp[pos++];
  28. }
  29. free(temp);
  30. }
  31. void mergeSort(int *data, int length)
  32. {
  33. int i, step;
  34. for (step = 1; step < length; step *= 2)
  35. {
  36. for (i = 0; i + step < length; i += 2 * step)
  37. {
  38. (i + 2 * step - 1 < length) ?
  39. merge(data, i, i + step - 1, i + 2 * step - 1) : merge(data, i, i + step - 1, length - 1);
  40. }
  41. }
  42. }

6. 堆排序:

  1. #include "main.h"
  2. void adjust(int *data, int pos, int length)
  3. {
  4. int parent = pos, child = 2 * parent + 1;
  5. while (child < length)
  6. {
  7. if (child + 1 < length && data[child + 1] > data[child])
  8. {
  9. child++;
  10. }
  11. if (data[parent] < data[child])
  12. {
  13. swap(data, parent, child);
  14. parent = child;
  15. child = 2 * parent + 1;
  16. }
  17. else
  18. {
  19. break;
  20. }
  21. }
  22. }
  23. void createHeap(int *data, int length)
  24. {
  25. int pos;
  26. for (pos = (length - 2) / 2; pos >= 0; pos--)
  27. {
  28. adjust(data, pos, length);
  29. }
  30. }
  31. void heapSort(int *data, int length)
  32. {
  33. int pos;
  34. createHeap(data, length);
  35. for (pos = length - 1; pos >= 0; pos--)
  36. {
  37. swap(data, pos, 0);
  38. adjust(data, 0, pos);
  39. }
  40. }
  41. void heapSortNoWrap(int *data, int length)
  42. {
  43. int start, end, child, parent, temp;
  44. end = length - 1;
  45. start = (end - 1) / 2;
  46. while (1)
  47. {
  48. if (0 <= start)
  49. {
  50. temp = data[start--];
  51. }
  52. else
  53. {
  54. if (0 == end)
  55. {
  56. return;
  57. }
  58. else
  59. {
  60. temp = data[end];
  61. data[end--] = data[0];
  62. }
  63. }
  64. parent = start + 1;
  65. child = 2 * parent + 1;
  66. while (child <= end)
  67. {
  68. if (child + 1 <= end && data[child + 1] > data[child])
  69. {
  70. child++;
  71. }
  72. if (temp < data[child])
  73. {
  74. data[parent] = data[child];
  75. parent = child;
  76. child = 2 * parent + 1;
  77. }
  78. else
  79. {
  80. break;
  81. }
  82. }
  83. data[parent] = temp;
  84. }
  85. }

发表评论

表情:
评论列表 (有 0 条评论,286人围观)

还没有评论,来说两句吧...

相关阅读

    相关 排序算法-归并排序

    1. 归并排序简介 归并排序是分治法运用的一个有效算法,大致分为两个部分,第一个是将一个无序表不断的二分,对得到的子部分继续二分,直到细分至每一个子部分都只有一个元素;

    相关 Java排序算法

    时间复杂度 f(n) 算法基本操作执行的方法 n表示算法的规模 O(n) f(n)的量级 稳定性: 同样元素的相对位置在排序前后是否有可能发生变化 冒泡排

    相关 排序算法总结

    前言: 最近在编程的时候总是遇到关于数组排序的问题,所以就想写一篇博客来总结几种常用的排序方法.我们下面所列举的排序都是升序排序,主要讲述的是算法,降序排序类似. 常

    相关 java排序算法

    一、冒泡排序   1、基本介绍   冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现