头文件Function.h
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<stdbool.h> #include<assert.h> void bubblesort(int *a, int n); void selectsort(int *a, int n); void insertsort(int *a, int n); void quicksort(int *a, int left,int right); int Partition(int *a, int left, int right); void mergesort(int *a, int low, int high); void merge(int *a, int low, int mid, int high); void heapsort(int *a, int n); void sift(int *a, int low, int high); void Swap(int *a, int *b); void Shellsort(int *a, int n); void doublebubble(int *a, int n); void oddfront(int *a, int n); void countsort(int *a, int len);
函数实现Achieve.c
#include"Function.h" //交换函数 void Swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } //冒泡排序 void bubblesort(int *a, int n) { int i, j;//排序需要进行的趟数为i, int flag = 0;//标志位,如果该趟没有进行交换,则说明序列已经有序 for (i = 0; i < n-1;i++) {//总共需要进行n-1趟排序可以得到最终结果 for(j=0;j<n-1-i;j++){ if (a[j] > a[j + 1]) Swap(&a[j], &a[j + 1]); } flag = 1; } if (flag == 0) return; } //选择排序 void selectsort(int *a, int n) { int i, j, min, temp; for (int i = 0; i < n - 1; i++) { min = i; for (j = i + 1; j < n; j++) { if (a[min] > a[j]) min = j; } if (i != min) Swap(&a[i], &a[min]); } } //插入排序 void insertsort(int *a, int n) { int i, j, temp; for (i = 1; i < n; i++) { { temp = a[i]; j = i - 1; } while (j >= 0 && temp < a[j]) { a[j + 1] = a[j]; --j; } a[j + 1] = temp; } } //快速排序 void quicksort(int *a, int left, int right) { int pivot = 0; if (left < right) { pivot = Partition(a, left, right); quicksort(a, left, pivot - 1); quicksort(a, pivot + 1, right); } } int Partition(int *a, int left, int right) { int pivot = a[left]; while (left < right) { while (right > left&&a[right] > pivot) right--; a[left] = a[right]; while (right > left&&a[left] < pivot) left++; a[right] = a[left]; } a[left] = pivot; return left; } ///归并排序 void mergesort(int *a, int low, int high) { if (low < high) { int mid = (low + high) / 2; mergesort(a, low, mid);//分治思想1.分开2.合并 mergesort(a, mid + 1, high); merge(a, low, mid, high); } } void merge(int *a, int low, int mid, int high) { int i, j, k; int n1 = mid - low + 1; int n2 = high - mid; int L[8], R[7]; for (i = 0; i < n1; i++) L[i] = a[low + i];//注意!!! for (j = 0; j < n2; j++) R[j] = a[mid + 1 + j]; i=0, j = 0; k = low; while (i < n1&&j < n2) {//注意!!! if (L[i] <= R[j]) a[k++] = L[i++]; else a[k++] = R[j++]; } while (i < n1) a[k++] = L[i++]; while (j < n2) a[k++] = R[j++]; } //----------------------堆排序步骤总结-------------------------------- //1.变成大根堆(从n/2-1开始,下标0结束) //2.一次大根堆形成后,先进行一次交换,再继续形成大根堆 void heapsort(int *a, int n) { int i; for (i = n / 2 - 1; i >= 0; --i) sift(a, i, n - 1); for (i = n - 1; i > 0; i++) { Swap(&a[0], &a[i]); sift(a, 0, i - 1); } } //--------------------调整为大根堆的步骤总结--------------------------- //1.要处理的元素保留下来 //2.找左右孩子中的较大者并与temp进行比较,会有两种情况,对其进行各自操作。 //3.把temp放入a[i]即可 void sift(int *a, int low, int high) { int i, j, temp; i = low, j = 2 * i + 1; temp = a[i]; while (j <= high) { if (j < high&&a[j] < a[j++]) j++; if (temp < a[j]) { a[i] = a[j]; i = j; j = 2 * i + 1; } else break; } a[i] = temp; } //希尔排序 void Shellsort(int *a, int n) { int temp; for (int gap = n / 2; gap > 0; gap /= 2)//gap为增量 { for (int i = gap; i < n; ++i) { temp = a[i];//保存该值 int j; //j从i的位置开始,对前面的增量处的元素进行比较 for (j = i; j >= gap && a[j - gap] > temp; j -= gap) a[j] = a[j - gap]; a[j] = temp; } } } //双向冒泡排序 void doublebubble(int *a, int n) { int low = 0, high = n - 1; bool flag = true;//标志位,进行一次交换操作则赋值为true int i; while (low < high && flag) { flag = false; for (i = low; i < high; i++) if (a[i] > a[i + 1]) { Swap(&a[i], &a[i + 1]); flag = true; } } high--; for (i = high; i < low; i--) if (a[i] > a[i - 1]) { Swap(&a[i], &a[i - 1]); flag = true; } } //把所有奇数移到偶数之前排序 void oddfront(int *a, int n) { int i = 0, j = n - 1; while (i < j) { while (i < j&&a[i] % 2 != 0) i++; while (i < j&&a[j] % 2 != 1) j--; if (i < j) { Swap(&a[i], &a[j]); i++; j--; } } } //计数排序 void countsort(int *a, int len) { assert(a); int max = a[0], min = a[0]; for (int i = 0; i < len; i++) { if (a[i] > max) max = a[i]; if (a[i] < min) min = a[i]; } //b为临时数组 int range = max - min + 1; int *b = (int *)calloc(range, sizeof(int)); for (int i = 0; i < len; i++) { b[a[i] - min] += 1;//为b数组元素赋值,其值为该数出现的次数 } int j = 0; for (int i = 0; i < range; i++) { while (b[i]--) { a[j++] = i + min;//按数组b中的次数顺序输出给a数组 } } free(b); b = NULL; }
主函数Main.c
#define _CRT_SECURE_NO_WARNINGS #include"Function.h" int main() { int a[15] = { 44,3,38,5,47,15,36,26,27,2,46,4,19,50,48 }; printf("原数组数据为:\n"); for (int i = 0; i < 15; i++) printf("%d ", a[i]); printf("\n计数排序结果如下:\n"); //bubblesort(&a, 15); //selectsort(&a,15); //insertsort(&a, 15); //shellsort(&a, 15); //quicksort(&a,0,14); //mergesort(&a, 0, 14); //heapsort(&a, 15); //Shellsort(&a, 15); //doublebubble(&a, 15); //oddfront(&a, 15); countsort(&a, 15); for (int i = 0; i < 15; i++) printf("%d ", a[i]); }