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

  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 }

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

上一篇:SpringBoot数据访问之整合mybatis注解版


下一篇:AcWing 787. 归并排序