排序算法

1.直接插入排序

直接插入排序是将原始数据依次从已排好序的序列的最右侧比较起,若小于则向前插,一直插到合适的位置即可。

源代码如下:

  1. #include<stdio.h>
  2. void sort(int a[],int n);     //函数原型
  3. int main(void)
  4. {
  5. int a[10];
  6. int i;
  7. for(i=1;i<=10;i++)         //a[0]用作监视哨,所以从1开始存储数据
  8. scanf("%d",&a[i]);
  9. sort(a,10);
  10. for(i=1;i<=10;i++)
  11. printf("%-4d",a[i]);
  12. printf("\n");
  13. }
  14. void sort(int a[],int n)
  15. {
  16. int i,j;
  17. for(i=2;i<=n;i++)          //从第二个元素开始和左边的第一个元素进行比较,第一个元素不比较
  18. {
  19. a[0]=a[i];                     //监视哨
  20. j=i-1;                          //j是当前元素左边的第一个元素
  21. while(a[0]<a[j])
  22. {
  23. a[j+1]=a[j];                //移动元素
  24. j--;
  25. }
  26. a[j+1]=a[0];               //插入监视哨的正确位置
  27. }
  28. }

效果图:

2.希尔排序

希尔排序是在直接插入排序的基础上做的改进,也就是将要排序的序列按固定增量分成若干组,等距离者在同一组中,然后再在组内进行直接插入排序,这里面的固定增量从n/2开始,以后每次缩小到原来的一半。

源代码如下:

  1. #include<stdio.h>
  2. void shsort(int a[],int n);
  3. int main(void)
  4. {
  5. int a[10];
  6. int i;
  7. for(i=1;i<=10;i++)
  8. scanf("%d",&a[i]);
  9. shsort(a,10);
  10. for(i=1;i<=10;i++)
  11. printf("%-4d",a[i]);
  12. printf("\n");
  13. }
  14. void shsort(int a[],int n)
  15. {
  16. int i,j,d;
  17. d=n/2;                             //设置增量
  18. while(d>=1)
  19. {
  20. for(i=d+1;i<=n;i++)
  21. {
  22. a[0]=a[i];                        //设置监视哨
  23. j=i-d;                              //对每隔d个距离的元素进行比较
  24. while(j>0&&a[0]<a[j])       //j要大于0否则会读取超出数组界限的数据
  25. {
  26. a[j+d]=a[j];                     //交换元素
  27. j=j-d;
  28. }
  29. a[j+d]=a[0];                    //插入监视哨的正确位置
  30. }
  31. d/=2;                              //缩小增量
  32. }
  33. }

效果图:

3.冒泡排序

基本思路:如果要对n个数进行冒泡排序,那么要进行n-1趟比较,在第一趟中要进行n-1次两两比较,在第j趟进行n-j次两两比较,因此采用嵌套for循环

源代码如下:

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. int a[10];
  5. int i,j,temp;
  6. for(i=0;i<=9;i++)
  7. scanf("%d",&a[i]);
  8. for(i=0;i<=8;i++)                         //冒泡排序进行n-1趟比较
  9. for(j=0;j<10-i;j++)                      //第j趟进行n-j次比较
  10. if(a[j]>a[j+1])                             //依次比较相邻数据,将大数据下沉
  11. {
  12. temp=a[j];
  13. a[j]=a[j+1];
  14. a[j+1]=temp;
  15. }
  16. for(i=0;i<=9;i++)
  17. printf("%-4d",a[i]);
  18. printf("\n");
  19. }

效果图:

4.快速排序

快速排序是冒泡排序的一种改进,主要的算法思想是在待排序的n个数据中取第一个数据作为基准值,将所有记录分为3组,使第一组中各数据值均小于或等于基准值,第二组做基准值的数据,第三组各数据值均大于或等于基准值,这便完成了第一趟分隔,然后再对第一组第三组分别重复上述方法。依次类推,直到每组中只有一个记录。

源代码如下:

  1. #include<stdio.h>
  2. void qusort(int a[],int start,int end);
  3. int main(void)
  4. {
  5. int a[10];
  6. int i;
  7. for(i=1;i<=10;i++)
  8. scanf("%d",&a[i]);
  9. qusort(a,1,10);
  10. for(i=1;i<=10;i++)
  11. printf("%-4d",a[i]);
  12. printf("\n");
  13. }
  14. void qusort(int a[],int start,int end)
  15. {
  16. int i,j;
  17. i=start;
  18. j=end;
  19. a[0]=a[i];                            //设置基准值
  20. while(i<j)                             //设置循环退出条件
  21. {
  22. while(i<j&&a[0]<a[j])           //从右边查找第一个小于基准值的元素
  23. j--;
  24. if(i<j)                                 //交换元素
  25. {
  26. a[i]=a[j];
  27. i++;                                  //i向后移动一格
  28. }
  29. while(i<j&&a[0]>a[i])          //从左边查找第一个大于基准值的元素
  30. i++;
  31. if(i<j)
  32. {
  33. a[j]=a[i];
  34. j--;
  35. }
  36. a[i]=a[0];                         //把基准值插入合适的位置
  37. }
  38. if(start<i)
  39. qusort(a,start,j-1);           //对第一组进行排序
  40. if(i<end)
  41. qusort(a,j+1,end);           //对第三组进行排序
  42. }

效果图:

5.选择排序

选择排序的基本算法是从待排序的区间中经过选择和交换后选出最小的数值存放到a[0]中,再将剩余的未排序区间中经过选择和交换后选出最小的数值存放到a[1]中,依次类推

源代码如下:

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. int a[10];
  5. int i,j,temp;
  6. for(i=0;i<=9;i++)
  7. scanf("%d",&a[i]);
  8. for(i=0;i<=8;i++)                          //i到数组倒数第二个元素为止
  9. for(j=i+1;j<=9;j++)                     //j从i右边第一个元素开始
  10. if(a[i]>a[j])                                  //交换元素
  11. {
  12. temp=a[i];
  13. a[i]=a[j];
  14. a[j]=temp;
  15. }
  16. for(i=0;i<=9;i++)
  17. printf("%-4d",a[i]);
  18. printf("\n");
  19. }

效果图:

6.归并排序

归并是将两个或多个有序记录序列合并成一个有序序列。归并方法有多种,一次对两个有序记录序列进行归并,称为二路归并排序,也有三路以及多路。
步骤如下:
一、将N个记录看成是N个长度为1的有序子表。
二、将两两相邻的有序子表进行归并。
三、重复步骤二,直到归并成一个长度为N的有序表。

源代码如下:

  1. #include<stdio.h>
  2. void merge_sort(int r[],int s[],int m, int n);
  3. void merge(int t[],int s[],int x1,int x2,int x3);
  4. int main(void)
  5. {
  6. int a[10];
  7. int i;
  8. for(i=1;i<=10;i++)
  9. scanf("%d",&a[i]);
  10. merge_sort(a,a,1,10);
  11. for(i=1;i<=10;i++)
  12. printf("%-4d",a[i]);
  13. printf("\n");
  14. }
  15. void merge_sort(int r[],int s[],int m, int n)
  16. {
  17. int t[20],p;
  18. if(m==n)
  19. s[m]=r[m];                                           //将数据存放到数组s中
  20. else
  21. {
  22. p=(m+n)/2;                                          //p用来划分序列
  23. merge_sort(r,t,m,p);                      //对前一个序列进行排序,将r[m]~r[p]归并成有序的t[m]~t[p]
  24. merge_sort(r,t,p+1,n);                  //对后一个序列进行排序,将r[p+1]~r[n]归并成有序的t[p+1]~t[n]
  25. merge(t,s,m,p,n);                                 //对两部分序列进行归并,将排好序的元素放入数组s中
  26. }
  27. }
  28. void merge(int t[],int s[],int x1,int x2,int x3)
  29. {
  30. int i,j,k;
  31. i=x1;                                           //第一部分的开始位置
  32. j=x2+1;                                      //第二部分的开始位置
  33. k=x1;                                         //标记开始位置
  34. while(i<=x2&&j<=x3)
  35. {
  36. if(t[i]<=t[j])
  37. {
  38. s[k]=t[i];
  39. k++;
  40. i++;
  41. }
  42. else
  43. {
  44. s[k]=t[j];
  45. k++;
  46. j++;
  47. }
  48. }
  49. while(i<=x2)
  50. s[k++]=t[i++];
  51. while(j<=x3)
  52. s[k++]=t[j++];
  53. }

效果图:

C语言之六大排序算法的更多相关文章

  1. C语言实现选择排序算法

    新人新气象,我又来了,C语言实现选择排序.很基础的东西,原理什么的就不扯了. #include <stdio.h> #include <stdlib.h> #include & ...

  2. C语言中的排序算法--冒泡排序,选择排序,希尔排序

    冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没 ...

  3. C语言实现常用排序算法——插入排序

    插入排序是最基础的排序算法,原理: 首先1个元素肯定是有序的,所以插入排序从第二个元素开始遍历:内循环首先请求一个空间保存待插入元素,从当前元素向数组起始位置反向遍历:当发现有大于待插入元素的元素,则 ...

  4. C语言笔记 13_排序算法

    排序算法 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序(如从大到小.首字母从A到Z)错误就把他们交换过来. 过程 ...

  5. C语言几种排序算法

    (1)选择排序算法:选择排序算法是,将第一个数和其它的数比较,将较小的数(从小到大的排列)和第一个数换位,以此类推 #include<stdio.h> int main() { int i ...

  6. C语言的经典排序算法源码

    1.插入排序:插入法是一种比较直观的排序方法.它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置.把数组元素插完也就完成了排序.代码如下: #include<stdio.h> ...

  7. 吴裕雄--天生自然C语言开发:排序算法

    #include <stdio.h> void bubble_sort(int arr[], int len) { int i, j, temp; ; i < len - ; i++ ...

  8. C语言实现常用排序算法——基数排序

    #include<stdio.h> #include<math.h> #define SIZE 10 #define C_SIZE 20 /*行数稳定=10,切记!列数务必搞的 ...

  9. C语言实现常用排序算法——冒泡排序

    原理:比较临近的两个元素,只要不符合顺序就进行交换:要点:1.不要越界:2.遍历一遍以后最大的元素就会到最后,所以下次遍历就不用遍历整个数组 void bubble_sort(int a[],int ...

随机推荐

  1. R使用入门

      R是一个开源的统计学软件包,用于数据计算,绘图等等用途,看介绍与大数据走得比较近. 入门还是很简单的,安装文件也非常的小. 官网网站,下载对应系统的安装包,55M,比matlab小多了,像操作系统 ...

  2. Uber到底挣钱不挣钱,听听司机怎么说

    “根本不挣钱.”Joel开着他崭新的丰田凯美瑞混合动力车,在硅谷早晨的濛濛细雨中,不无幽怨地说.Joel是一名Uber司机,从坐上他车的那一刻起,他的抱怨便一直没停过:“过去日子还挺好过,一个月靠开U ...

  3. cocos2d-x游戏开发(十六)帧动画

    欢迎转载:http://blog.csdn.net/dawn_moon/article/details/11775745 本来想写一下帧动画的,搜了一下网上好像有一大把,就懒得写了,直接贴代码. // ...

  4. GridView行编辑、更新、取消、删除事件使用方法

    注意:当启用编辑button时,点击编辑button后会使一整行都切换成文本框.为了是一行中的一部分是文本框,须要把以整行的全部列都转换成模板,然后删掉编辑模板中的代码.这样就能使你想编辑的列转换成文 ...

  5. Web前端开发工程师为什么讨厌IE6!

  6. redis之入门操作

    下载安装 $ wget http://download.redis.io/releases/redis-3.2.3.tar.gz $ tar xzf redis-3.2.3.tar.gz $ cd r ...

  7. BZOJ 1191: [HNOI2006]超级英雄Hero(二分图匹配)

    云神说他二分图匹配从来都是用网络流水过去的...我要发扬他的精神.. 这道题明显是二分图匹配.网络流的话可以二分答案+最大流.虽然跑得很慢.... -------------------------- ...

  8. [一个经典的多线程同步问题]解决方案一:关键段CS

    前面提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题. 本文先介绍如何使用关键段,然后再深层次的分析下关键段的实现机制和原理. 关键段CRITICA ...

  9. DropBox为什么一直那么红——靠用户体验,旗帜鲜明,它要保存的是你的重要随身资料,并且开放API

    链接:http://www.zhihu.com/question/19705960/answer/71742127来源:知乎 看到这个问题竟然从11年答到现在,有趣的是这几年里国内云存储行业变化也是蛮 ...

  10. SQL server 数据库视频总结

    用了半个多月的时间把,浙江大学耿建玲老师 数据库视频看了一遍.在看视频之前,曾经接收了一个学生信息管理系统,在学习  学生信息管理系统的时候,对于数据库的部分,总是那么一知半解.带着疑惑来看耿建玲老师 ...