当前位置:   article > 正文

排序法 C语言常考的十大排序法 数列、字符的排序_字符排序c语言

字符排序c语言

通过对近各大试卷题型分析,总结出 对于数据排序的十大方法,希望对大家有所帮助

方法一:冒泡排序法(升序排序法)

方法二:选择排序法

方法三:插入排序

方法四:希尔排序法(Shell Sort)

方法五:归并排序法

方法六:快速排序法(交换排序法)

方法七:堆排序法

方法八:计数排序法

方法九:桶排序法

方法十:基数排序法

1.冒泡排序法

1.1 算法描述
步骤1: 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
步骤2: 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应               该会是最大的数;
步骤3: 针对所有的元素重复以上的步骤,除了最后一个;
步骤4: 重复步骤1~3,直到排序完成。

冒泡排序法动画演示

(1)对数列的排序:

  1. #include <stdio.h>
  2. #define sequence 10//自定义十个元素的数列
  3. int main()
  4. {
  5. int a[sequence] = {12,43,9,13,67,98,101,89,3,35 };//十个数的无序数列
  6. //也可以改为用scanf输入
  7. int i, j, t;
  8. printf("此程序使用冒泡排序法排列无序数列!\n");
  9. //冒泡排序
  10. for (i = 0; i < 10 - 1; i++)//n个数的数列总共扫描n-1次
  11. {
  12. for (j = 0; j < 10 - i - 1; j++)//每一趟扫描到a[n-i-2]与a[n-i-1]比较为止结束
  13. {
  14. if (a[j] > a[j + 1])//后一位数比前一位数小的话,就交换两个数的位置(升序)
  15. {
  16. t = a[j + 1];
  17. a[j + 1] = a[j];
  18. a[j] = t;
  19. }
  20. }
  21. }
  22. printf("排列好的数列是:\n");
  23. //输出排列好得吃数列
  24. for (i = 0; i < 10; i++)
  25. {
  26. printf("%d ", a[i]);
  27. }
  28. return 0;
  29. }

运行结果如下:

(2)对字符的排序

  1. #include <stdio.h>
  2. #define Character_groups 10//定义了十个字符的字符数组
  3. int main()
  4. {
  5. char a[Character_groups] = { 'i','l','o','v','e','y','o','u','y','x' };//十个数的无序数列
  6. //也可以改用scanf函数输入字符
  7. int i, j;
  8. char t;
  9. printf("此程序使用冒泡排序法排列无序数列!\n");
  10. //冒泡排序
  11. for (i = 0; i < 10 - 1; i++)//n个数的数列总共扫描n-1次
  12. {
  13. for (j = 0; j < 10 - i - 1; j++)//每一趟扫描到a[n-i-2]与a[n-i-1]比较为止结束
  14. {
  15. if (a[j] > a[j + 1])//后一位数比前一位数小的话,就交换两个数的位置(升序)
  16. {
  17. t = a[j + 1];
  18. a[j + 1] = a[j];
  19. a[j] = t;
  20. }
  21. }
  22. }
  23. printf("排列好的字符组是:\n");
  24. //输出排列好得吃数列
  25. for (i = 0; i < 10; i++)
  26. {
  27. printf("%c ", a[i]);
  28. }
  29. return 0;
  30. }

运行结果如下:

     

           对字符串的排序----(自定义函数的方法实现)

  1. #include <stdio.h>
  2. void function(char a[], int m)
  3. {
  4. //冒泡排序
  5. int i, j;
  6. char tmp;
  7. for (i = 0; i < m - 1; i++)//n个数的数列总共扫描n-1次
  8. {
  9. for (j = 0; j < m - i - 1; j++)//每一趟扫描到a[n-i-2]与a[n-i-1]比较为止结束
  10. {
  11. if (a[j] > a[j + 1])//后一位数比前一位数小的话,就交换两个数的位置(升序)
  12. {
  13. tmp = a[j + 1];
  14. a[j + 1] = a[j];
  15. a[j] = tmp;
  16. }
  17. }
  18. }
  19. return;
  20. }
  21. int main()
  22. {
  23. void function(char a[], int);//尤其注意,此处的函数声明必须是char a[],因为这里穿的是地址,不能仅仅使用char
  24. int i;
  25. char a[10] = { 'i','l','o','v','e','y','o','u','y','x' };//十个数的无序字符数列
  26. printf("此程序使用冒泡排序法排列无序数列!\n");
  27. function(a, 10);//调用冒泡排序
  28. printf("排列好的字符组是:\n");
  29. //输出排列好得吃数列
  30. for (i = 0; i < 10; i++)
  31. {
  32. printf("%c ", a[i]);
  33. }
  34. return 0;
  35. }

运行结果如下:

2.选择排序法

步骤1:初始状态:无序区为R[1…n],有序区为空;
步骤2:第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1…i-1]和R(i…n)。该趟排              序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使                    R[1…i]和R[i+1…n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
步骤3:n-1趟结束,数组有序化了。

选择排序法动画演示

两层for循环实现 

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i, j, k, n, tmp, a[1000];
  5. printf("请输入需要排序的数据个数\n");
  6. scanf("%d",&n);// 从键盘输入待排序的数据个数
  7. for (i = 0; i < n; i++)
  8. { // 利用for循环依次将输入的数据放置在数组中
  9. scanf("%d",&a[i]);
  10. }
  11. for (i = 0; i < n - 1; i++)
  12. {// 外层循环 变量i控制排序总共进行n-1轮
  13. k = i;
  14. for (j = i + 1; j < n; j++)
  15. { //内层循环 变量j控制每轮进行比较的次数
  16. if (a[j] < a[k])
  17. {
  18. k = j; //k记录每轮比较中的最小者的下标
  19. if (k != i)
  20. { //将第i轮的最小者,与a[i]交换
  21. tmp = a[i];
  22. a[i] = a[k];
  23. a[k] = tmp;
  24. }
  25. }
  26. }
  27. }
  28. printf("排序后的数据如下:\n");
  29. for (i = 0; i < n; i++) { // 利用for循环进行输出
  30. printf("%d\t", a[i]);
  31. }
  32. return 0;
  33. }

     运行结果如下:

   自定义函数的方法实现

  1. #include<stdio.h>
  2. void SelectSort(int a[], int n)
  3. { //选择排序
  4. int mix, tmp;
  5. int i, j;
  6. for (i = 0; i < n - 1; i++)
  7. { //每次循环数组,找出最小的元素,放在前面,前面的即为排序好的
  8. mix = i; //假设最小元素的下标
  9. for (j = i + 1; j < n; j++) //将上面假设的最小元素与数组比较,交换出最小的元素的下标
  10. if (a[j] < a[mix])
  11. mix = j;
  12. //若数组中真的有比假设的元素还小,则交换
  13. if (i != mix)
  14. {
  15. tmp = a[i];
  16. a[i] = a[mix];
  17. a[mix] = tmp;
  18. }
  19. }
  20. }
  21. int main()
  22. {
  23. int a[10] = { 9,1,5,8,3,7,4,6,2,0 };
  24. int i;
  25. SelectSort(a, 10);
  26. for (i = 0; i < 10; i++)
  27. printf("%d ", a[i]);
  28. printf("\n");
  29. return 0;
  30. }

 运行结果如下:

指针传参方法实现:

  1. #include<stdio.h>
  2. //指针方法实现十个整数的排序
  3. int main()
  4. {
  5. void sort(int x[], int n);//函数的声明
  6. int i, * p, a[10];//定义i,*p,数组a
  7. p = a;//把首元素的地址赋值给指针变量p
  8. printf("please enter 10 integer numbers:");
  9. for (i = 0; i < 10; i++)
  10. {
  11. scanf("%d", p++);//将从数组的每一个元素的地址都存到内存当中去
  12. }
  13. p = a;//再次将指针p指向首元素的地址
  14. sort(p, 10);//函数的调用
  15. for (p, i = 0; i < 10; i++)//输出语句 可以写p=a;或者直接写p
  16. {
  17. printf("%d ", *p);
  18. p++;
  19. }
  20. printf("\n");
  21. return 0;
  22. }
  23. void sort(int x[], int n)
  24. {
  25. int i, j, k, t;
  26. for (i = 0; i < n - 1; i++)//外层循环控制比较的总趟数 n-1趟
  27. {
  28. k = i;//第一次先将下标0对应的元素作为最大元素的下标
  29. for (j=i+1; j < n ; j++)//内层循环控制每趟比较的总次数
  30. {
  31. if (x[j] > x[k])
  32. {
  33. k = j; //k始终保存最大值元素的下标
  34. }
  35. if(k!=i)//如果最大值元素的下标不是最前面的i,则交换元素值
  36. {
  37. t = x[i];
  38. x[i] = x[k];
  39. x[k] = t;
  40. }
  41. }
  42. }
  43. }

代码运行结果如下:

3.插入排序法

步骤1: 从第一个元素开始,该元素可以认为已经被排序;
步骤2: 取出下一个元素,在已经排序的元素序列中从后向前扫描;
步骤3: 如果该元素(已排序)大于新元素,将该元素移到下一位置;
步骤4: 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
步骤5: 将新元素插入到该位置后;
步骤6: 重复步骤2~5。

插入排序法动画演示

(1)简单方法实现 

  1. #include<stdio.h>
  2. #include<string.h>
  3. #define sequence 5
  4. void insertSort(int a[])
  5. {
  6. int i, j, temp;
  7. for (i = 1; i < sequence; i++)
  8. {
  9. temp = a[i];
  10. //当前数小于前一位数时
  11. if (a[i] < a[i - 1])
  12. {
  13. //将子序列重新排列为有序序列
  14. for (j = i - 1; temp < a[j]; j--)
  15. {
  16. a[j + 1] = a[j];
  17. }
  18. a[j + 1] = temp;
  19. }
  20. }
  21. }
  22. int main()
  23. {
  24. int a[] = { 45,32,56,71,12 };
  25. int i;
  26. printf("未排序前:\n");
  27. for (i = 0; i < sequence; i++)
  28. {
  29. printf("%d ", a[i]);
  30. }
  31. printf("\n经过直接插入排序后:\n");
  32. insertSort(a);
  33. for (i = 0; i < sequence; i++)
  34. {
  35. printf("%d ", a[i]);
  36. }
  37. return 0;
  38. }

 运行结果如下:

 (2)自定义函数方法实现

  1. #include <stdio.h>
  2. void print(const int* a, const int length)
  3. {
  4. int i;
  5. for (i = 0; i < length; i++)
  6. {
  7. printf("%d ", a[i]);
  8. }
  9. putchar('\n');
  10. }
  11. void pushFront(int* a, const int length, const int key)
  12. {
  13. //将所有a[j]到a[length]都往后推一格
  14. int tmp = a[length];
  15. for (int i = length; i > key; i--)
  16. {
  17. a[i] = a[i - 1];
  18. }
  19. a[key] = tmp;
  20. }
  21. void insertSort(int* a, const int length)
  22. {
  23. for (int i = 0; i < length; i++)
  24. {
  25. for (int j = 0; j < i; j++)
  26. {
  27. if (a[i] < a[j])
  28. {
  29. pushFront(a, i, j);
  30. break;
  31. }
  32. }
  33. print(a, i + 1);
  34. }
  35. }
  36. int main()
  37. {
  38. const int length = 5;
  39. int my_array[5] = { 1,5,4,3,7 };
  40. print(my_array, length);
  41. insertSort(my_array, length);
  42. return 0;
  43. }

     运行结果如下:

 (3)折半插入排序法实现

  1. #include<stdio.h>
  2. #define N 10
  3. //对数组a进行折半插入排序,n为数组的长度;
  4. void Half_Sort(int a[])
  5. {
  6. for (int i = 1; i < N; i++)
  7. {
  8. int x = a[i]; //将需要进行插入排序的元素赋值给x;
  9. int low = 0, high = i - 1; //设置折半的头和尾;
  10. while (low <= high)
  11. {
  12. int mid = (low + high) / 2; //设置中间元素,与插入的元素进行比较;
  13. if (x < a[mid]) //比较;
  14. high = mid - 1;
  15. else
  16. low = mid + 1;
  17. }
  18. for (int j = i - 1; j >= low; j--) //记录依次向后移;
  19. a[j + 1] = a[j]; //将当前这个值赋给这个元素的后一个元素;
  20. a[low] = x; //插入记录;
  21. }
  22. }
  23. int main()
  24. {
  25. int a[N] = { 3,2,8,5,4,7,6,9,1,10 }; //定义数组;
  26. printf("原始数据为:\n");
  27. for (int i = 0; i < N; i++) //输出原始数据;
  28. printf("%d ", a[i]);
  29. printf("\n\n");
  30. Half_Sort(a);
  31. printf("使用插入排序后的数据为:\n");
  32. for (int i = 0; i < N; i++)
  33. printf("%d ", a[i]);
  34. printf("\n");
  35. return 0;
  36. }

运行结果如下:

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

闽ICP备14008679号