当前位置:   article > 正文

将一个字符串从小到大排序输出_字符串从小到大排序算法

字符串从小到大排序算法

方法一普通排序(啥也不是时间复杂度o(n……2)):

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. char a[1000000];
  5. scanf("%s",a);
  6. int n=0;
  7. for(int i=1;a[i-1]!='\0';n++,i++)
  8. ;
  9. /*
  10. for(int i=1;n>=i;i++)//正常应该这么写
  11. {
  12. for(int j=1;n>j;j++)
  13. {
  14. if(a[j-1]>a[j])
  15. {
  16. char t=a[j-1];
  17. a[j-1]=a[j];
  18. a[j]=t;
  19. }
  20. }
  21. }
  22. */
  23. int i,j;//如果编译器不行还是把ij定义在外面吧。。。
  24. for(i=1;n>=i;i++)
  25. {
  26. for(j=1;n>j;j++)//不能等于防止越界
  27. {
  28. if(a[j-1]>a[j])
  29. {
  30. char t=a[j-1];
  31. a[j-1]=a[j];
  32. a[j]=t;
  33. }
  34. }
  35. }
  36. puts(a);
  37. }

 

 方法二:冒泡排序(最简单的比较快的方法时间复杂度O(n……2)):

(就是第一种优化一下,每一次少算一个,因为最后一个一定排好了)

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. char a[1000000];
  5. scanf("%s",a);
  6. int n=0;
  7. for(int i=1;a[i-1]!='\0';n++,i++)
  8. ;
  9. int i,j;//如果编译器不行还是把ij定义在外面吧。。。
  10. for(i=1;n>=i;i++)
  11. {
  12. for(j=1;n-i>=j;j++)//不能等于防止越界
  13. {
  14. if(a[j-1]>a[j])
  15. {
  16. char t=a[j-1];
  17. a[j-1]=a[j];
  18. a[j]=t;
  19. }
  20. }
  21. }
  22. puts(a);
  23. }

方法三:插入排序(每次找最小值)O(n……2):

  1. #include<stdio.h>
  2. void swap(char *a,char *b)
  3. {
  4. char t=*a;
  5. *a=*b;
  6. *b=t;
  7. }
  8. int main(void)
  9. {
  10. char a[1000000];
  11. scanf("%s",a);
  12. int n=0;
  13. for(int i=1;a[i-1]!='\0';n++,i++)
  14. ;
  15. int i,j=1;//如果编译器不行还是把ij定义在外面吧。。。
  16. for(i=1;n>=i;i++)
  17. {
  18. int min=j-1;
  19. for(int k=j;n>=k;k++)
  20. if(a[k-1]<a[min])
  21. min=k-1;
  22. swap(&a[min],&a[j-1]);//交换两个值
  23. j++;
  24. }
  25. puts(a);
  26. }

方法四:快排(最基本的排序)(O(nlogn)比较快):

  1. #include<stdio.h>
  2. void swap(char *a,char *b)
  3. {
  4. char t=*a;
  5. *a=*b;
  6. *b=t;
  7. }
  8. void q_sort(int l ,int r ,char a[])
  9. {
  10. if(l>=r)return;
  11. int mid=(l+r)>>1;
  12. char x=a[mid];
  13. int i=l-1,j=r+1;
  14. while(i<j)
  15. {
  16. do i++;while(a[i]<x);
  17. do j--;while(a[j]>x);
  18. if(i<j)
  19. {
  20. swap(&a[i],&a[j]);
  21. }
  22. }
  23. q_sort(l,j,a);
  24. q_sort(j+1,r,a);
  25. return ;
  26. }
  27. int main(void)
  28. {
  29. int n=0;
  30. char a[100000];
  31. scanf("%s",a);
  32. for(int i=1;a[i-1]!='\0';i++,n++)
  33. ;
  34. q_sort(0,n-1,a);
  35. for(int i=1;n>=i;i++)
  36. printf("%c",a[i-1]);
  37. return 0;
  38. }

方法五归并排序(稳定,O(nlongn)):

  1. #include<stdio.h>
  2. char c[100010];
  3. void merge_sort(char a[],int l,int r)
  4. {
  5. if(l>=r)return;
  6. int mid=(l+r)>>1;
  7. merge_sort(a,l,mid);
  8. merge_sort(a,mid+1,r);
  9. int i=l,j=mid+1,k=0;
  10. while(i<=mid&&j<=r)
  11. {
  12. if(a[i]<a[j])c[k++]=a[i++];
  13. else
  14. c[k++]=a[j++];
  15. }
  16. while(i<=mid)c[k++]=a[i++];
  17. while(j<=r)c[k++]=a[j++];
  18. for(i=l,j=0;j<k;i++,j++)
  19. {
  20. a[i]=c[j];
  21. }
  22. return;
  23. }
  24. int main(void)
  25. {
  26. int n;
  27. char a[100000];
  28. scanf("%s",a);
  29. for(int i=1;a[i-1]!='\0';i++,n++)
  30. ;
  31. merge_sort(a,0,n-1);
  32. puts(a);
  33. return 0;
  34. }

方法六:(桶排序O(n))

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. int a[400]={0};
  5. char b;
  6. while(scanf("%c",&b)!=EOF)
  7. {
  8. a[b]++;
  9. }
  10. for(int i=1;400>=i;i++)
  11. {
  12. for(int j=1;a[i-1]>=j;j++)
  13. printf("%c",i-1);
  14. }
  15. return 0;
  16. }

方法七q_sort;

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int cmp(const void *a, const void *b)
  4. {
  5. return *(char*)a - *(char*)b; //由小到大排序
  6. //return *(int *)b - *(int *)a; 由大到小排序
  7. }
  8. int main(void)
  9. {
  10. int n;
  11. char a[10000];
  12. scanf("%s",a);
  13. for(int i=1;a[i-1]!='\0';i++,n++)
  14. ;
  15. qsort(a, n, sizeof(char), cmp);
  16. puts(a);
  17. return 0;
  18. }

还有诸多例如堆排序,选择排序。等等,其实也就快排和归并有点用,其他都没什么用。。。

供自己以后复习使用

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

闽ICP备14008679号