当前位置:   article > 正文

10种排序算法总结-(c语言实现与动画演示)

10种排序算法总结-(c语言实现与动画演示)

算法分类

十种常见排序算法可以分为两大类

比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。
非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。

稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。

不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。

1.冒泡排序:

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. void BubbleSort(int *arr,int size)
  4. {
  5. int i = 0;
  6. int j = 0;
  7. for(i=0;i<size-1;i++)
  8. {
  9. for(j=0;j<size-i-1;j++)
  10. {
  11. if(arr[j]>arr[j+1])
  12. {
  13. int tmp = arr[j];
  14. arr[j] = arr[j+1];
  15. arr[j+1] = tmp;
  16. }
  17. }
  18. }
  19. }
  20. int main()
  21. {
  22. int a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
  23. int len=sizeof(a)/sizeof(a[0]);
  24. BubbleSort(a,len);
  25. for(int i=0;i<len;i++)
  26. printf("%d--",a[i]);
  27. }

2.选择排序

  1. #include<stdio.h>
  2. void swap(int* a,int* b)//交换函数
  3. {
  4. int tem=*a;
  5. *a=*b;
  6. *b=tem;
  7. }
  8. void selectionSort(int *arr, int n) //选择排序函数
  9. {
  10. for (int i = 0; i < n - 1; i++)
  11. {
  12. int minIndex = i;
  13. for (int j = i + 1; j < n; j++)
  14. {
  15. if (arr[j] < arr[minIndex])
  16. {
  17. minIndex = j;
  18. }
  19. }
  20. swap(&arr[minIndex],&arr[i]);
  21. }
  22. }
  23. int main()
  24. {
  25. int arr[] = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
  26. int n = sizeof(arr) / sizeof(arr[0]);
  27. selectionSort(arr, n);
  28. for(int i=0;i<n;i++)
  29. printf("%d--",arr[i]);
  30. }

3.插入排序

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. void swap(int* a,int* b)
  4. {
  5. int tem=*a;
  6. *a=*b;
  7. *b=tem;
  8. }
  9. void InsertSort(int *arr,int n)
  10. {
  11. for(int i=1;i<n;i++)
  12. {
  13. if(arr[i]<arr[i-1])
  14. {
  15. swap(&arr[i],&arr[i-1]);
  16. for(int j=i-1;j>0&&arr[j]<arr[j-1];j--)
  17. {
  18. swap(&arr[j],&arr[j-1]);
  19. }
  20. }
  21. }
  22. }
  23. int main()
  24. {
  25. int arr[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
  26. int n = sizeof(arr) / sizeof(arr[0]);
  27. InsertSort(arr,n);
  28. for(int i=0;i<n;++i)
  29. {
  30. printf("%d--",arr[i]);
  31. }
  32. }

4.希尔排序

  1. #include<stdio.h>
  2. //希尔排序
  3. void ShellSort(int *arr,int n){
  4. int d,i,j,temp;
  5. for(d=n/2;d>=1;d=d/2){
  6. for(i=d;i<n;i++){//增量
  7. if(arr[i]<arr[i-d]){
  8. temp=arr[i];
  9. for(j=i-d;j>=0&&temp<arr[j];j-=d){
  10. arr[j+d]=arr[j];
  11. }
  12. arr[j+d]=temp;
  13. }
  14. }
  15. }
  16. }
  17. int main()
  18. {
  19. int arr[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
  20. int n = sizeof(arr) / sizeof(arr[0]);
  21. ShellSort(arr,n);
  22. for(int i=0;i<n;++i)
  23. {
  24. printf("%d--",arr[i]);
  25. }
  26. }

5.归并排序

  1. #include<stdio.h>
  2. void merge(int arr[], int left[], int size_left, int right[], int size_right)
  3. {
  4. int i = 0, j = 0, k = 0;
  5. while (i < size_left && j < size_right)
  6. {
  7. if (left[i] <= right[j])
  8. {
  9. arr[k++] = left[i++];
  10. }
  11. else
  12. {
  13. arr[k++] = right[j++];
  14. }
  15. }
  16. // 复制剩余的元素
  17. while (i < size_left)
  18. {
  19. arr[k++] = left[i++];
  20. }
  21. while (j < size_right)
  22. {
  23. arr[k++] = right[j++];
  24. }
  25. }
  26. // 归并排序
  27. void mergeSort(int *arr, int n) {
  28. if (n <= 1) return;
  29. int mid = n / 2;
  30. int left[mid];
  31. int right[n - mid];
  32. // 复制数据到临时数组
  33. for (int i = 0; i < mid; i++)
  34. {
  35. left[i] = arr[i];
  36. }
  37. for (int i = mid; i < n; i++)
  38. {
  39. right[i - mid] = arr[i];
  40. }
  41. // 递归排序左半部分和右半部分
  42. mergeSort(left, mid);
  43. mergeSort(right, n - mid);
  44. // 合并两个已排序的数组
  45. merge(arr, left, mid, right, n - mid);
  46. }
  47. int main()
  48. {
  49. int arr[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
  50. int n = sizeof(arr) / sizeof(arr[0]);
  51. mergeSort(arr, n);
  52. for(int i=0;i<n;++i)
  53. {
  54. printf("%d--",arr[i]);
  55. }
  56. }

6.快速排序

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. void swap(int* a,int* b)
  4. {
  5. int tem=*a;
  6. *a=*b;
  7. *b=tem;
  8. }
  9. int Partition(int* arr,int low ,int high)
  10. {
  11. int pk=arr[low];
  12. while(low<high)
  13. {
  14. while(low<high&&arr[high]>=pk)
  15. high--;
  16. arr[low]=arr[high];
  17. while(low<high&&arr[low]<pk)
  18. low++;
  19. arr[high]=arr[low];
  20. }
  21. arr[low]=pk;
  22. return low;
  23. }
  24. void QuickSort(int* arr,int low,int high)
  25. {
  26. if(low<high)
  27. {
  28. int pkloc=Partition(arr,low,high);//找到分界线
  29. QuickSort(arr,low,pkloc-1);
  30. QuickSort(arr,pkloc+1,high);
  31. }
  32. }
  33. int main()
  34. {
  35. int arr[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
  36. int n = sizeof(arr) / sizeof(arr[0]);
  37. QuickSort(arr,0,n-1);
  38. for(int i=0;i<n;++i)
  39. {
  40. printf("%d--",arr[i]);
  41. }
  42. }

7.堆排序

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<malloc.h>
  4. void siftDown(int* heap,int n,int p);
  5. void swap(int* a,int* b)
  6. {
  7. int tem=*a;
  8. *a=*b;
  9. *b=tem;
  10. }
  11. int RemoveMinKey(int* heap,int n)
  12. {
  13. int key =heap[0];
  14. heap[0]=heap[n];
  15. siftDown(heap,n,0);
  16. return key;
  17. }
  18. void siftDown(int* heap,int n,int p)
  19. {
  20. int i=p;//i
  21. int j=2*i+1;//左子树
  22. while(j<n)//不超出范围
  23. {
  24. if(j<n-1&&heap[j]>heap[j+1])//j为左子树,+1为右子树
  25. j++;
  26. if(heap[i]<=heap[j])
  27. break;
  28. else
  29. {
  30. swap(&heap[j],&heap[i]);
  31. i=j;
  32. j=2*i+1;
  33. }
  34. }
  35. }
  36. void HeapSort(int* arr,int n)
  37. {
  38. int *heap=(int*)malloc(sizeof(int)*n);
  39. for(int i=0;i<n;++i)
  40. {
  41. heap[i]=arr[i];
  42. }
  43. int curpos=n/2-1;
  44. while(curpos>=0)
  45. {
  46. siftDown(heap,n,curpos);
  47. curpos--;
  48. }
  49. for(int i=0;i<n;++i)
  50. {
  51. //printf("%d ",heap[i]);
  52. arr[i]=RemoveMinKey(heap,n-i-1);
  53. }
  54. //printf("\n");
  55. free(heap);
  56. heap=NULL;
  57. }
  58. int main()
  59. {
  60. int arr[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
  61. int n = sizeof(arr) / sizeof(arr[0]);
  62. HeapSort(arr,n);
  63. for(int i=0;i<n;++i)
  64. {
  65. printf("%d--",arr[i]);
  66. }
  67. }

8.计数排序

  1. #include <stdio.h>
  2. #include<malloc.h>
  3. // 计数排序函数
  4. void countingSort(int arr[], int n)
  5. {
  6. // 找到数组中的最大值
  7. int max = arr[0];
  8. for (int i = 1; i < n; i++)
  9. {
  10. if (arr[i] > max)
  11. {
  12. max = arr[i];
  13. }
  14. }
  15. // 初始化计数数组
  16. int *count = (int *)malloc(sizeof(int) * (max + 1));
  17. for(int i=0;i<=max;i++)
  18. count[i]=0;
  19. // 计算每个元素的计数
  20. for (int i = 0; i < n; i++)
  21. {
  22. count[arr[i]]++;
  23. }
  24. int output=0;//计数
  25. for(int i=0;i<=max;i++)//循环每个计数盘子
  26. {
  27. while(count[i]>0)//当盘子中数的个数大于0时,赋值到arr,并减少一个
  28. {
  29. arr[output++]=i;//赋值给arr
  30. count[i]--;
  31. }
  32. }
  33. free(count);
  34. }
  35. int main()
  36. {
  37. int arr[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
  38. int n = sizeof(arr) / sizeof(arr[0]);
  39. countingSort(arr,n);
  40. for(int i=0;i<n;++i)
  41. {
  42. printf("%d--",arr[i]);
  43. }
  44. }

9.基数排序

  1. #include <stdio.h>
  2. #include<malloc.h>
  3. //基数排序
  4. void RadixSort(int* arr, int n)
  5. {
  6. int max = arr[0];
  7. int base = 1;
  8. //找出数组中的最大值
  9. for (int i = 0; i < n; i++)
  10. {
  11. if (arr[i] > max)
  12. {
  13. max = arr[i];
  14. }
  15. }
  16. //临时存放数组元素的空间
  17. int* tmp = (int*)malloc(sizeof(int)*n);
  18. //循环次数为最大数的位数
  19. while (max / base > 0)
  20. {
  21. //定义十个桶,桶里面装的不是数据本身,而是每一轮排序对应(十、白、千...)位的个数
  22. //统计每个桶里面装几个数
  23. int bucket[10] = { 0 };
  24. for (int i = 0; i < n; i++)
  25. {
  26. //arr[i] / base % 10可以取到个位、十位、百位对应的数字
  27. bucket[arr[i] / base % 10]++;
  28. }
  29. //循环结束就已经统计好了本轮每个桶里面应该装几个数
  30. //将桶里面的元素依次累加起来,就可以知道元素存放在临时数组中的位置
  31. for (int i = 1; i < 10; i++)
  32. {
  33. bucket[i] += bucket[i - 1];
  34. }
  35. //循环结束现在桶中就存放的是每个元素应该存放到临时数组的位置
  36. //开始放数到临时数组tmp
  37. for (int i = n - 1; i >= 0; i--)
  38. {
  39. tmp[bucket[arr[i] / base % 10] - 1] = arr[i];
  40. bucket[arr[i] / base % 10]--;
  41. }
  42. //把临时数组里面的数拷贝回去
  43. for (int i = 0; i < n; i++)
  44. {
  45. arr[i] = tmp[i];
  46. }
  47. base *= 10;
  48. }
  49. free(tmp);
  50. }
  51. int main()
  52. {
  53. int arr[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
  54. int n = sizeof(arr) / sizeof(arr[0]);
  55. RadixSort(arr,n);
  56. for(int i=0;i<n;++i)
  57. {
  58. printf("%d--",arr[i]);
  59. }
  60. }

参考:https://www.cnblogs.com/onepixel/p/7674659.html

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号