三种排基本序算法
###参考资料:手机版APPC语编译器
###包括文件操作 冒泡排序算法 选择排序算法 插入排序算法
排序算法
#include <stdio.h>
#include <stdlib.h>
/*
冒泡排序:
* 冒泡排序是一种极其简单的排序算法,也是我所学的第一个排序算法。
* 它重复地走访过要排序的元素,依次比较相邻两个元素,
* 如果他们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。
* 这个算法的名字由来是因为越小(或越大)的元素会经由交换慢慢“浮”到数列的顶端。
冒泡排序算法的运作如下:
1、比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置。
2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3、针对所有的元素重复以上的步骤,除了最后一个。
4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
// 分类 -------------- 内部比较排序
// 数据结构 ---------- 数组
// 最差时间复杂度 ---- O(n^2)
// 最优时间复杂度 ---- 如果能在内部循环第一次运行时,使用一个旗标来表示有无需要交换的可能,可以把最优时间复杂度降低到O(n)
// 平均时间复杂度 ---- O(n^2)
// 所需辅助空间 ------ O(1)
// 稳定性 ------------ 稳定
由于它的简洁,冒泡排序通常被用来对于程序设计入门的学生介绍算法的概念。冒泡排序的代码如下:
*/
void xuanzepaixu(int arry[],int n);
void swapc(int arry[],int i,int j);
int main()
{
int n,i;
printf("请输入你要读取的数剧个数:");
scanf("%d",&n);
int a[n];
FILE *fr,*fw;
fr=fopen("F:\\C语言\\经典算法\\经典排序算法\\冒泡排序算法\\a.txt","r");
fw=fopen("F:\\C语言\\经典算法\\经典排序算法\\冒泡排序算法\\b.txt","w");
if(fr==NULL)
{
printf("文件打开失败!");
}
printf("输出读入的%d个数据:\n",n);
for(i=0;i<n;i++)//feof可以用与检测文件尾标志是否已被读过
{
fscanf(fr,"%d",&a[i]);//注意读入格式"%d,"或者"%d"要和文件中一样。
printf(" %d",a[i]);
}
xuanzepaixu(a,n);
fprintf(fw,"前%d个数据的排序结果如下:\n",n);
for(i=0;i<n;i++)//feof可以用与检测文件尾标志是否已被读过
{
fprintf(fw," %d",a[i]);//注意读入格式"%d,"或者"%d"要和文件中一样。
}
fclose(fr);
fclose(fw);
return 0;
}
void swapc(int arry[],int i,int j)
{
int max=arry[i];
arry[i]=arry[j];
arry[j]=max;
}
void xuanzepaixu(int arry[],int n){
for(int i=0;i<n-1;i++)//控制从第几个元素开始,每次最大元素像冒泡一样移动数组的最后面
{
for(int j=0;j<n-1-i;j++)//将最大的元素(最小的)移动到右边
{
if(arry[j]>arry[j+1])//交换顺序 从数组第一个元素开始依次作比较相邻两个元素,把较大元素移动到数组的后面
{
swapc(arry,j,j+1);//如果大于把这两个元素的顺序交换
}
}
}
printf("\n前%d个数的排序结果:\n",n);
for(int i=0;i<n;i++)
{
printf(" %d",arry[i]);
}
}
运行结果如下:
选择排序算法
#include <stdio.h>
#include <stdlib.h>
/*
选择排序算法:
* 冒泡排序是一种极其简单的排序算法,也是我所学的第一个排序算法。
* 它重复地走访过要排序的元素,依次比较相邻两个元素,
* 如果他们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。
* 这个算法的名字由来是因为越小(或越大)的元素会经由交换慢慢“浮”到数列的顶端。
冒泡排序算法的运作如下:
1、比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置。
2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3、针对所有的元素重复以上的步骤,除了最后一个。
4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
// 分类 -------------- 内部比较排序
// 数据结构 ---------- 数组
// 最差时间复杂度 ---- O(n^2)
// 最优时间复杂度 ---- 如果能在内部循环第一次运行时,使用一个旗标来表示有无需要交换的可能,可以把最优时间复杂度降低到O(n)
// 平均时间复杂度 ---- O(n^2)
// 所需辅助空间 ------ O(1)
// 稳定性 ------------ 稳定
由于它的简洁,冒泡排序通常被用来对于程序设计入门的学生介绍算法的概念。冒泡排序的代码如下:
*/
void xuanzepaixu(int arry[],int n);
void swapc(int arry[],int i,int j);
int main()
{
int a[]={3,4,11,23,1,22};
//int a[6]={3,4,11,23,1,22};
int n=sizeof(a)/sizeof(a[0]);//获取数组的长度
printf("输出数组的长度:");
printf("%d\n",n);
xuanzepaixu(a,n);
//xuanzepaixu(a,6);
return 0;
}
void xuanzepaixu(int arry[],int n){
for(int i=0;i<n;i++)
{
for (int j=i+1;j<n+1;j++)//从数组的第一个元素开始依次和arry[i]z这元素作比较,如果大的交换它们的顺序
{
if(arry[i]>arry[j])
{
swapc(arry,i,j);
}
}
}
printf("输出选择排序的结果:\n");
for(int i=0;i<n;i++){
printf("%d\n",arry[i]);
}
}
void swapc(int arry[],int i,int j)
{
int max=arry[i];
arry[i]=arry[j];
arry[j]=max;
}
运行结果如下:
插入排序算法
#include <stdio.h>
#include <stdlib.h>
/*
插入排序是一种简单直观的排序算法。它的工作原理非常类似于我们抓扑克牌
对于未排序数据(右手抓到的牌),在已排序序列(左手已经排好序的手牌)中从后向前扫描,找到相应位置并插入。
插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),
因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
具体算法描述如下:
1、从第一个元素开始,该元素可以认为已经被排序
2、取出下一个元素,在已经排序的元素序列中从后向前扫描
3、如果该元素(已排序)大于新元素,将该元素移到下一位置
4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5、将新元素插入到该位置后
6、重复步骤2~5
插入排序的代码如下:
// 分类 ------------- 内部比较排序
// 数据结构 ---------- 数组
// 最差时间复杂度 ---- 最坏情况为输入序列是降序排列的,此时时间复杂度O(n^2)
// 最优时间复杂度 ---- 最好情况为输入序列是升序排列的,此时时间复杂度O(n)
*/
void charupaixu(int arry[],int n);
int main()
{
int n,i;
printf("请输入选择你要排序的个数:");
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++ ){
printf("请输入你要排序的第%d个数:",i+1);
scanf("%d",&a[i]);
}
charupaixu(a,n);
printf("输出排序结果:");
for(i=0;i<n;i++ ){
printf(" %d",a[i]);
}
return 0;
}
void charupaixu(int arry[],int n){
for(int i=1;i<n;i++)//依次访问各个元素
{
int get=arry[i];//访问一个元素 相当于右手抓到一张牌
int j=i-1; //该元素左边的元素,都是排好序的 j控制访问该元素左边排好序所有的元素
while(j>=0 && arry[j]>get)// 将该元素与左边的元素进行比较
{
arry[j+1]=arry[j];//如果这个元素小于左边第一个元素,将左边第一个元素右移
j--; //j-- 继续与左边的元素比较,直至该元素大于或者等于左边排好序的一个元素,结束该循环
}
arry[j+1]=get;//直到该元素比左边排好序的元素大或者其相等。将该元素插入与其相等或者小于该元素的元素的右边
}
}
运行结果如下: