ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

十大排序算法——实现程序

2021-08-29 10:00:38  阅读:123  来源: 互联网

标签:arr 十大 temp int len ++ 算法 排序 left


  1 //冒泡排序
  2 //它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来
  3 //每循环一次,最大值移到最右边
  4 void bubble_sort(int* arr, int len) {
  5     int i, j, temp;
  6     for (i = 0; i < len - 1; i++) {
  7         for (j = 0; j < len - 1 - i; j++) {
  8             if (arr[j] > arr[j + 1]) {
  9                 temp = arr[j + 1];
 10                 arr[j + 1] = arr[j];
 11                 arr[j] = temp;
 12             }
 13         }
 14     }
 15 }
 16 
 17 
 18 //选择排序
 19 //首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,
 20 //然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
 21 //以此类推,直到所有元素均排序完毕。
 22 void selection_sort(int* arr, int len) {
 23     int i, j, temp, min;
 24     for (i = 0; i < len; i++) {
 25         min = i;
 26         for (j = i; j < len; j++) {
 27             if (arr[min] > arr[j]) {
 28                 min = j;
 29             }
 30         }
 31         if (min != i) {
 32             temp = arr[min];
 33             arr[min] = arr[i];
 34             arr[i] = temp;
 35         }
 36     }
 37 }
 38 
 39 
 40 //插入排序
 41 //通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
 42 void insert_sort(int* arr, int len) {
 43     int temp, i, j;
 44     for (i = 1; i < len; i++) {
 45         temp = arr[i];
 46         for (j = i - 1; j >= 0 && arr[j] > temp; j--) {
 47             arr[j + 1] = arr[j];
 48         }
 49         arr[j + 1] = temp;
 50     }
 51 }
 52 
 53 
 54 //希尔排序——进阶版插入排序
 55 //先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,
 56 //待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序
 57 void shell_sort(int* arr, int len) {
 58     int i, j, gap;
 59     int temp;
 60     for (gap = len >> 1; gap > 0; gap >>= 1) {
 61         for (i = gap; i < len; i++) {
 62             temp = arr[i];
 63             for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap) {
 64                 arr[j + gap] = arr[j];
 65             }
 66             arr[j + gap] = temp;
 67         }
 68     }
 69 }
 70 
 71 
 72 //快速排序——递归法
 73 void swap(int* a, int* b) { //交换数值
 74     int temp = *a;
 75     *a = *b;
 76     *b = temp;
 77 }
 78 
 79 void quick_sort_recursive(int *arr, int start, int end) {
 80     if (start >= end) {
 81         return;
 82     }
 83     int mid = arr[end];
 84     int left = start, right = end - 1;
 85     while (left < right) {
 86         while (arr[left] < mid && left < right) {
 87             left++;
 88         }
 89         while (arr[right] > mid && left < right) {
 90             right--;
 91         }
 92         swap(&arr[left], &arr[right]);
 93     }
 94     if (arr[left] > arr[end]) {
 95         swap(&arr[left], &arr[end]);
 96     }
 97     else
 98     {
 99         left++;
100     }
101     if (left) {
102         quick_sort_recursive(arr, start, left - 1);
103     }
104     quick_sort_recursive(arr, left + 1, end);
105 }
106 
107 void quick_sort(int* arr, int len) {
108     quick_sort_recursive(arr, 0, len - 1);
109 }
110 
111 
112 //计数排序
113 void counting_sort(int* arr, int *sorted_arr, int len) {
114     int* count_arr = (int*)malloc(sizeof(int) * 100);
115     memset(count_arr, 0, sizeof(int) * 100);
116     int k = 0;
117     for (int i = 0; i < len; i++) {
118         count_arr[arr[i]]++;
119     }
120     for (int j = 0; j < 100; j++) {
121         while (count_arr[j] != 0) {
122             sorted_arr[k++] = j;
123             count_arr[j]--;
124         }
125     }
126     free(count_arr);
127 }

标签:arr,十大,temp,int,len,++,算法,排序,left
来源: https://www.cnblogs.com/demo-lv/p/15201954.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有