C语言之六大排序算法
排序算法
1.直接插入排序
直接插入排序是将原始数据依次从已排好序的序列的最右侧比较起,若小于则向前插,一直插到合适的位置即可。
源代码如下:
- #include<stdio.h>
- void sort(int a[],int n); //函数原型
- int main(void)
- {
- int a[10];
- int i;
- for(i=1;i<=10;i++) //a[0]用作监视哨,所以从1开始存储数据
- scanf("%d",&a[i]);
- sort(a,10);
- for(i=1;i<=10;i++)
- printf("%-4d",a[i]);
- printf("\n");
- }
- void sort(int a[],int n)
- {
- int i,j;
- for(i=2;i<=n;i++) //从第二个元素开始和左边的第一个元素进行比较,第一个元素不比较
- {
- a[0]=a[i]; //监视哨
- j=i-1; //j是当前元素左边的第一个元素
- while(a[0]<a[j])
- {
- a[j+1]=a[j]; //移动元素
- j--;
- }
- a[j+1]=a[0]; //插入监视哨的正确位置
- }
- }
效果图:
2.希尔排序
希尔排序是在直接插入排序的基础上做的改进,也就是将要排序的序列按固定增量分成若干组,等距离者在同一组中,然后再在组内进行直接插入排序,这里面的固定增量从n/2开始,以后每次缩小到原来的一半。
源代码如下:
- #include<stdio.h>
- void shsort(int a[],int n);
- int main(void)
- {
- int a[10];
- int i;
- for(i=1;i<=10;i++)
- scanf("%d",&a[i]);
- shsort(a,10);
- for(i=1;i<=10;i++)
- printf("%-4d",a[i]);
- printf("\n");
- }
- void shsort(int a[],int n)
- {
- int i,j,d;
- d=n/2; //设置增量
- while(d>=1)
- {
- for(i=d+1;i<=n;i++)
- {
- a[0]=a[i]; //设置监视哨
- j=i-d; //对每隔d个距离的元素进行比较
- while(j>0&&a[0]<a[j]) //j要大于0否则会读取超出数组界限的数据
- {
- a[j+d]=a[j]; //交换元素
- j=j-d;
- }
- a[j+d]=a[0]; //插入监视哨的正确位置
- }
- d/=2; //缩小增量
- }
- }
效果图:

3.冒泡排序
基本思路:如果要对n个数进行冒泡排序,那么要进行n-1趟比较,在第一趟中要进行n-1次两两比较,在第j趟进行n-j次两两比较,因此采用嵌套for循环
源代码如下:
- #include<stdio.h>
- int main(void)
- {
- int a[10];
- int i,j,temp;
- for(i=0;i<=9;i++)
- scanf("%d",&a[i]);
- for(i=0;i<=8;i++) //冒泡排序进行n-1趟比较
- for(j=0;j<10-i;j++) //第j趟进行n-j次比较
- if(a[j]>a[j+1]) //依次比较相邻数据,将大数据下沉
- {
- temp=a[j];
- a[j]=a[j+1];
- a[j+1]=temp;
- }
- for(i=0;i<=9;i++)
- printf("%-4d",a[i]);
- printf("\n");
- }
效果图:
4.快速排序
快速排序是冒泡排序的一种改进,主要的算法思想是在待排序的n个数据中取第一个数据作为基准值,将所有记录分为3组,使第一组中各数据值均小于或等于基准值,第二组做基准值的数据,第三组各数据值均大于或等于基准值,这便完成了第一趟分隔,然后再对第一组第三组分别重复上述方法。依次类推,直到每组中只有一个记录。
源代码如下:
- #include<stdio.h>
- void qusort(int a[],int start,int end);
- int main(void)
- {
- int a[10];
- int i;
- for(i=1;i<=10;i++)
- scanf("%d",&a[i]);
- qusort(a,1,10);
- for(i=1;i<=10;i++)
- printf("%-4d",a[i]);
- printf("\n");
- }
- void qusort(int a[],int start,int end)
- {
- int i,j;
- i=start;
- j=end;
- a[0]=a[i]; //设置基准值
- while(i<j) //设置循环退出条件
- {
- while(i<j&&a[0]<a[j]) //从右边查找第一个小于基准值的元素
- j--;
- if(i<j) //交换元素
- {
- a[i]=a[j];
- i++; //i向后移动一格
- }
- while(i<j&&a[0]>a[i]) //从左边查找第一个大于基准值的元素
- i++;
- if(i<j)
- {
- a[j]=a[i];
- j--;
- }
- a[i]=a[0]; //把基准值插入合适的位置
- }
- if(start<i)
- qusort(a,start,j-1); //对第一组进行排序
- if(i<end)
- qusort(a,j+1,end); //对第三组进行排序
- }
效果图:
5.选择排序
选择排序的基本算法是从待排序的区间中经过选择和交换后选出最小的数值存放到a[0]中,再将剩余的未排序区间中经过选择和交换后选出最小的数值存放到a[1]中,依次类推
源代码如下:
- #include<stdio.h>
- int main(void)
- {
- int a[10];
- int i,j,temp;
- for(i=0;i<=9;i++)
- scanf("%d",&a[i]);
- for(i=0;i<=8;i++) //i到数组倒数第二个元素为止
- for(j=i+1;j<=9;j++) //j从i右边第一个元素开始
- if(a[i]>a[j]) //交换元素
- {
- temp=a[i];
- a[i]=a[j];
- a[j]=temp;
- }
- for(i=0;i<=9;i++)
- printf("%-4d",a[i]);
- printf("\n");
- }
效果图:
6.归并排序
归并是将两个或多个有序记录序列合并成一个有序序列。归并方法有多种,一次对两个有序记录序列进行归并,称为二路归并排序,也有三路以及多路。
步骤如下:
一、将N个记录看成是N个长度为1的有序子表。
二、将两两相邻的有序子表进行归并。
三、重复步骤二,直到归并成一个长度为N的有序表。
源代码如下:
- #include<stdio.h>
- void merge_sort(int r[],int s[],int m, int n);
- void merge(int t[],int s[],int x1,int x2,int x3);
- int main(void)
- {
- int a[10];
- int i;
- for(i=1;i<=10;i++)
- scanf("%d",&a[i]);
- merge_sort(a,a,1,10);
- for(i=1;i<=10;i++)
- printf("%-4d",a[i]);
- printf("\n");
- }
- void merge_sort(int r[],int s[],int m, int n)
- {
- int t[20],p;
- if(m==n)
- s[m]=r[m]; //将数据存放到数组s中
- else
- {
- p=(m+n)/2; //p用来划分序列
- merge_sort(r,t,m,p); //对前一个序列进行排序,将r[m]~r[p]归并成有序的t[m]~t[p]
- merge_sort(r,t,p+1,n); //对后一个序列进行排序,将r[p+1]~r[n]归并成有序的t[p+1]~t[n]
- merge(t,s,m,p,n); //对两部分序列进行归并,将排好序的元素放入数组s中
- }
- }
- void merge(int t[],int s[],int x1,int x2,int x3)
- {
- int i,j,k;
- i=x1; //第一部分的开始位置
- j=x2+1; //第二部分的开始位置
- k=x1; //标记开始位置
- while(i<=x2&&j<=x3)
- {
- if(t[i]<=t[j])
- {
- s[k]=t[i];
- k++;
- i++;
- }
- else
- {
- s[k]=t[j];
- k++;
- j++;
- }
- }
- while(i<=x2)
- s[k++]=t[i++];
- while(j<=x3)
- s[k++]=t[j++];
- }
效果图:
C语言之六大排序算法的更多相关文章
- C语言实现选择排序算法
新人新气象,我又来了,C语言实现选择排序.很基础的东西,原理什么的就不扯了. #include <stdio.h> #include <stdlib.h> #include & ...
- C语言中的排序算法--冒泡排序,选择排序,希尔排序
冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没 ...
- C语言实现常用排序算法——插入排序
插入排序是最基础的排序算法,原理: 首先1个元素肯定是有序的,所以插入排序从第二个元素开始遍历:内循环首先请求一个空间保存待插入元素,从当前元素向数组起始位置反向遍历:当发现有大于待插入元素的元素,则 ...
- C语言笔记 13_排序算法
排序算法 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序(如从大到小.首字母从A到Z)错误就把他们交换过来. 过程 ...
- C语言几种排序算法
(1)选择排序算法:选择排序算法是,将第一个数和其它的数比较,将较小的数(从小到大的排列)和第一个数换位,以此类推 #include<stdio.h> int main() { int i ...
- C语言的经典排序算法源码
1.插入排序:插入法是一种比较直观的排序方法.它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置.把数组元素插完也就完成了排序.代码如下: #include<stdio.h> ...
- 吴裕雄--天生自然C语言开发:排序算法
#include <stdio.h> void bubble_sort(int arr[], int len) { int i, j, temp; ; i < len - ; i++ ...
- C语言实现常用排序算法——基数排序
#include<stdio.h> #include<math.h> #define SIZE 10 #define C_SIZE 20 /*行数稳定=10,切记!列数务必搞的 ...
- C语言实现常用排序算法——冒泡排序
原理:比较临近的两个元素,只要不符合顺序就进行交换:要点:1.不要越界:2.遍历一遍以后最大的元素就会到最后,所以下次遍历就不用遍历整个数组 void bubble_sort(int a[],int ...
随机推荐
- hbase0.96 put流程 源码分析
无意间多瞄了一眼hbase0.98的代码,想复习下put流程.发现htable里面已经找不到processBatchOfPuts()奇怪了.看了半天原来变化还真大事实上0.96就没这个了,于是又搞了个 ...
- 【C/C++多线程编程之九】pthread读写锁
多线程编程之读写锁 Pthread是 POSIX threads 的简称,是POSIX的线程标准. pthread读写锁把对共享资源的訪问者分为读者和写者,读者仅仅对共享资源 ...
- 简单使用SimpleCursorAdapter
http://my.oschina.net/javaeye/blog/14846 果使用Sqlite,建议和ContentProvider结合使用.这样数据库的生命周期就不用自己管了.然后,如果要在比 ...
- ios7 UIScrollView 尺寸问题
假设在UINavigationController内设置一个UIViewControlller,而UIViewController的第一个子视图是UIScrollView的话,UIScrollview ...
- Node.js模块os
OS 操作系统模块 os.hostname() 操作系统的主机名. os.type() 操作系统的名称 os.release() 操作系统的发行版本 os.uptime() 当前系统的时间 以秒为 o ...
- Foundation 框架 NSString常用总结
iOS开发过程中,从始至终都会和NSString打交道,在此总结一下NSString的常用的方法,在以后的学习过程中用到的方法也会继续添加 NSString类是Foundation框架中得不可变字符串 ...
- ubuntu下使用codeblocks
集成开发环境搭建 1. 安装build-essential 方法: sudo apt-get install build-essential 作用:提供编译程序必须软件包的列表信息,编译程序有了这个软 ...
- [一个经典的多线程同步问题]解决方案一:关键段CS
前面提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题. 本文先介绍如何使用关键段,然后再深层次的分析下关键段的实现机制和原理. 关键段CRITICA ...
- linux怎样修改用户权限
ls -l 查看目录下的文件详细信息 ll 同上 whoami 功能说明:先似乎用户名称. 语 法:whoami [--help][--version] 补充说明:显示自身的用户名称,本指令相当于执 ...
- eclipse手动添加源码
在开发过程中,有的时候需要我们自已手动去添加一些源码文件,但是由于我们可能在eclipse中安装了jad反编译插件,我们再用“Ctrl + 鼠标左键”的话,会打开已经反编译好的class文件,而不是带 ...