三种排基本序算法

三种排基本序算法

###参考资料:手机版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;//直到该元素比左边排好序的元素大或者其相等。将该元素插入与其相等或者小于该元素的元素的右边
    }
}

运行结果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值