当前位置:   article > 正文

【C语言】冒泡排序,选择排序,插入排序,堆排序_c语言二叉树堆排序

c语言二叉树堆排序
冒泡排序【稳定排序】
  1. ///冒泡
  2. void BubbleSort(int arr[], int len){
  3. if (len <= 1){
  4. return;
  5. }
  6. int bound = 0;
  7. for (; bound < len; bound++){
  8. int cur = len - 1;
  9. for (; cur>bound; cur--){
  10. if (arr[cur] < arr[bound]){
  11. swap(&arr[cur], &arr[bound]);
  12. }
  13. }
  14. }
  15. }
选择排序

“打擂台”

  1. ///选择排序//
  2. void SelectSort(int arr[], int len){
  3. if (len <= 1){
  4. return;
  5. }
  6. int bound = 0;
  7. for (; bound < len; bound++){
  8. int cur = bound + 1;
  9. for (; cur < len; cur++){
  10. if (arr[bound]>arr[cur]){
  11. swap(&arr[bound], &arr[cur]);
  12. }
  13. }
  14. }
  15. }
插入排序【稳定排序】
步骤:

  1. 定义好边界。
  2. 保存bound指向的元素
  3. 从后往前的去找一个合适的防治bound_value的位置,一边找一边搬运。

特点:

  • 当数组元素个数比较小的时候,执行效率比较快
  • 如果数组基本有序,执行效率会很高
  1. 插入排序///
  2. void InserSort(int arr[], int len){
  3. if (len <= 1){
  4. return;
  5. }
  6. int bound = 1;
  7. for (; bound < len; bound++){
  8. int bound_value = arr[bound];
  9. int cur = bound;
  10. for (; cur>0; cur--){
  11. if (arr[cur - 1] > bound_value){
  12. arr[cur] = arr[cur - 1];
  13. }
  14. else
  15. {
  16. break;
  17. }
  18. }
  19. arr[cur] = bound_value;
  20. }
  21. }
堆排序

堆的性质:完全二叉树

        如果是小队,父节点的值小于子节点,如果是大堆,反之。

堆排序步骤:

  1. 基于数组建堆
  2. 循环删除堆顶元素,将所有的元素都删除,排序完成
  1. int cmp(int a, int b){
  2. return a > b ? 1 : 0;
  3. }
  4. void AdjustDown(int arr[], int len, int index){
  5. size_t parent = index;
  6. size_t child = 2 * parent + 1;
  7. while (child<len){
  8. if (child + 1<len&&cmp(arr[child + 1], arr[child])){
  9. child = child + 1;
  10. }
  11. if (cmp(arr[child], arr[parent])){
  12. swap(&arr[child], &arr[parent]);
  13. }
  14. else{
  15. break;
  16. }
  17. parent = child;
  18. child = parent * 2 + 1;
  19. }
  20. return;
  21. }
  22. void AdjustUp(int arr[], int len, int index){
  23. if (len <= index){
  24. return;
  25. }
  26. size_t child = index;
  27. size_t parent = (child - 1) / 2;
  28. while (child>0){
  29. if (cmp(arr[child], arr[parent])){
  30. swap(&arr[child], &arr[parent]);
  31. }
  32. else{
  33. break;
  34. }
  35. child = parent;
  36. parent = (child - 1) / 2;
  37. }
  38. }
  39. void HeapPop(int arr[], int len){
  40. swap(&arr[0], &arr[len - 1]);
  41. AdjustDown(arr, len-1, 0);
  42. }
  43. void HeapCreate(int arr, int len){
  44. if (len <= 1){
  45. return;
  46. }
  47. int i =len-1;
  48. for (; i > 0; --i){
  49. AdjustUp(arr, len, i);
  50. }
  51. AdjustUp(arr, len, 0);
  52. }
  53. void heapSort(int arr[], int len){
  54. HeapCreate(arr, len);
  55. int i = 0;
  56. for (; i < len-1; i++){
  57. HeapPop(arr, len - i);
  58. }
  59. int left = 0;
  60. int right = len - 1;
  61. }

希尔排序【稳定排序】------分组式的插入排序

gap:步长,指同组元素之间的下表间隔

gap取值:N/2,N/4,N/8......1;

  1. void shellSort(int arr[], int len){
  2. int gap = 0;
  3. for (gap = len / 2; gap >= 1; gap = gap / 2){
  4. int i = 0;
  5. for (; i < len / gap; i++){
  6. int j = i + gap;
  7. for (; j < len; j = j + gap){
  8. if (arr[i]>arr[j]){
  9. swap(&arr[i], &arr[j]);
  10. }
  11. else{
  12. break;
  13. }
  14. }
  15. }
  16. }
  17. }


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

闽ICP备14008679号