我是靠谱客的博主 安详钢笔,最近开发中收集的这篇文章主要介绍c语言数据结构排序算法汇总,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

/*
*简单插入排序(以temp元素为中间值 控制循环条件 不满足条件进行交换)
*插入排序(插入一个数据保持有序排列)
*冒泡排序
*改进的冒泡排序算法(有效的降低时间复杂度)
*希尔排序(有点模糊)(插入排序的升级版 增加了增量的概念 可以降低时间复杂度)
*选择排序
*快速排序 (递归的思想)
*堆排序算法(利用二叉树点的储存规则 保证树中元素的顺序保持递增或者递减的规律)
*基数排序算法 (分配(两次分配) 收集 输出)主关键字和次关键字的分配
*归并排序算法
*/

实现代码
#include<stdio.h>
#include<stdlib.h>
#define RADIX 10//基数的个数 0-9
typedef struct node
{
    int  key;//关键字
    struct node *next;//指向下一个数据节点的指针
}Node;//数据节点指针
void simple_insertsort(int *s,int length);//简单插入排序
void insert_sort(int *s,int length,int k);//插入排序
void bubble_sort(int *s,int length);//冒泡排序
void pre_bubblesort(int *s,int length);//改进的冒泡排序的算法
void select_sort(int *s,int length);//选择排序
void shell_sort(int *s,int length);//希尔排序
void Quick_Sort(int *s,int i,int j);//快速排序算法
int partition(int *s,int i,int j);//快速划分函数  配合快速排序函数的使用
void Heap_Sort(int *s,int length);//堆排序算法
void Heap_Adjust(int *s,int i,int length);//排序调整函数 配合堆排序函数的使用
void Radix_sort(int a[],int n);//基数排序函数
int resolve(int key,int level);//对数据进行划分层次
void Arrange(Node*arraynode,Node*group[],int level);//对待排序数据进行分配处理
Node*collect(Node*group[]);//对group数组进行收集处理的函数
void Merge_sort(int *a,int i,int j,int*b );//归并排序函数
void Merge(int *a,int s1,int e1,int s2,int e2,int *b);//合并函数
void  main()
{
    int m;//数据的个数
    int n[100];//待排序的数组
    int s[100];//中间数组
    int i;
    int k;//输入的插入数据
    printf("请输入数据的个数:n");
      scanf("%d",&m);
      printf("请依次输入数据:n");
        for(i=0;i<m;i++)
            scanf("%d",&n[i]);
          printf("===========堆排序==============n");
          Heap_Sort(n,m);
          for(i=0;i<m;i++)
            printf("%dt",n[i]);
             printf("n");
              printf("==========简单插入排序==============n");
                simple_insertsort(n,m);
                for(i=0;i<m;i++)
                    printf("%dt",n[i]);
                   printf("n");

        printf("==========冒泡排序==============n");
                bubble_sort(n,m);
                for(i=0;i<m;i++)
                    printf("%dt",n[i]);
                   printf("n");
        printf("==========改进的冒泡排序==============n");
            pre_bubblesort(n,m);
              for(i=0;i<m;i++)
                printf("%dt",n[i]);
               printf("n");
       printf("==========选择排序==============n");
              select_sort(n,m);
              for(i=0;i<m;i++)
                  printf("%dt",n[i]);
                  printf("n");
    printf("==========希尔排序==============n");
         shell_sort(n,m);
           for(i=0;i<m;i++)
              printf("%dt",n[i]);
           printf("n");
    printf("==========快速排序==============n");
          Quick_Sort(n,0,m-1);//传值传的是第一个数组元素和最后一个数组元素的下标
          for(i=0;i<m;i++)
            printf("%dt",n[i]);
            printf("n");
            printf("==========基数排序==============n");
              Radix_sort(n,m);
              for(i=0;i<m;i++)
                printf("%dt",n[i]);
              printf("n");//换行
            printf("==========归并排序==============n");
                 Merge_sort(n,0,m-1,s);
                 for(i=0;i<m;i++)
                    printf("%dt",n[i]);
                    printf("n");
         printf("==========插入排序==============n");
              printf("请输入要插入的数据:n");
                 scanf("%d",&k);
                 insert_sort(n,m,k);
                   for(i=0;i<m+1;i++)
                      printf("%dt",n[i]);
                     printf("n");
}
void Heap_Sort(int *s,int length)//堆排序算法
{
    int i;
    int temp;//中间变量
    for(i=length/2-1;i>=0;--i)
        Heap_Adjust(s,i,length);//构建堆的过程
      //调整排序范围的过程
          for(i=length-1;i>0;--i)
          {
                 temp=s[i];//将数组中的第一各元素和最后一个元素交换数值
                 s[i]=s[0];
                 s[0]=temp;
                 Heap_Adjust(s,0,i);//将最大值赋值给后面的节点  创造遍历时递增排序的效果

          }
}
void Heap_Adjust(int *s,int i,int length)
{
    int temp;
    int child;//用来存储孩子节点在数组中的下标
      for( ; 2*i+1<length;i=child)//循环的判断条件是判断是否该节点存在孩子节点
      {
                child=2*i+1;
                 if(child<length-1&&s[child]<s[child+1])//length-1代表最后一个元素的下标
                 // 如果child<length-1说明child所在的节点还有一个兄弟节点
                  child++;//如果右节点大于左节点  将右节点的值  赋值给其父亲节点
                 if(s[i]<s[child])//该节点的值小于其孩子节点的值   将值进行交换
                 {
                     temp=s[i];
                     s[i]=s[child];
                     s[child]=temp;//交换数值

                 }
                 else
                    break;

      }
}
void simple_insertsort(int *s,int length)//简单插入排序
{
    int i,j;
    int temp;//中间变量
    for(i=1;i<length;i++)
    {
        temp=s[i];
        for(j=i-1;j>=0&&temp<s[j];j--)
        {
            s[j+1]=s[j];
        }
        s[j+1]=temp;
    }
}
void insert_sort(int *s,int length,int k)
{
    //递增的冒泡排序
    int i,j;
    int t;
    for(i=0;i<length-1;i++)
        for(j=0;j<length-i-1;j++)
       {
                if(s[j+1]< s[j])
                {
                    t=s[j+1];
                    s[j+1]=s[j];
                    s[j]=t;//数值交换
                }

      }
    //进行插入排序
      for(i=length-1;i>=0;i--)
      {
            if(k<s[i])
            {
                s[i+1]=s[i];
            }
            else
                break;

      }
      s[i+1]=k;//进行插入
}
void bubble_sort(int *s,int length)
{
    int i,j;
    int t;
    for(i=0;i<length-1;i++)
     for(j=0;j<length-i-1;j++)
     {
        if(s[i]>s[i+1])
        {
            t=s[i];
            s[i]=s[i+1];
            s[i+1]=t;//交换数据
        }
    }
}
void pre_bubblesort(int *s,int length)
{
    int i;
    int j=length-1;
    int flag;//循环结束的标志
    int t;
    while(flag)
    {
        flag=0;
        for(i=0;i<j;i++)
        {
            if(s[i]>s[i+1])
            {
                t=s[i];
                s[i]=s[i+1];
                s[i+1]=t;
                flag=1;//以flag的值作为循环结束的标志
                         // 可以在有序的情况下降低时间复杂度
            }
        }
        j--;
    }
}
void  select_sort(int *s,int length )
{
    int i,j;
    int k;
    int  t;
    for(i=0;i<length;i++)
    {
        k=i;
        for(j=i;j<length;j++)
        {
            if(s[j]<s[k])
            {
                k=j;
            }
        }
        if(k!=i)
        {
            t=s[k];
            s[k]=s[i];
            s[i]=t;//交换数据
        }

    }
}
void  shell_sort(int *s,int length)
{
    int increment;//增量变量
     int i;
     int j;
     int temp;
       for(increment=length/2;increment>0;increment/=2)//控制增量的规则变化
          for(i=increment;i<length;i++)//进行快速排序在 增量规则变化的基础上
       {
           temp=s[i];
           for(j=i-increment;j>=0&&s[j]>temp;j-=increment)
           {
               s[j+increment]=s[j];
           }
           s[j+increment]=temp;
       }
}
void Quick_Sort(int *s,int i,int j)//快速排序算法
{
    int k;
    if(i<j)
    {
        k=partition(s,i,j);
       Quick_Sort(s,i,k-1);
       Quick_Sort(s,k+1,j);

    }

}
int  partition(int *s,int i,int j)
{
    //划分函数
    int temp=s[i];
    while(i<j)
    {
        while(i<j&&s[j]>temp)
            j--;
           if(i<j)
           {
               s[i++]=s[j];
           }
           while(i<j&&s[i]<temp)
           {
               i++;
           }
           if(i<j)
            {
                s[j--]=s[i];
            }
    }
    s[i]=temp;
    //将temp的值赋值给最后停留在的数组的元素
    //保证数组两边以temp为基准左边的小于temp右边的大于temp的数据
    return i;//返回调整完之后的数组的下标  便于之后以下标两边为基准做划分调整
}
void Radix_sort(int a[],int n)
{
    int i,j;//循环
    int  level;//层次变量
    Node*pnode;
    Node*postnode;//指向最后一个节点的指针
    Node*group[RADIX];//创建一个存储各个分组头指针的指针数组
    Node*arraynode=(Node*)malloc(sizeof(Node)*n);//创建一个储存待排序数据的链表
    //对group数组进行初始化
      for(i=0;i<RADIX;i++)
      {
          group[i]=NULL;
      }
      //对arraynode数组进行初始化
        for(j=0;j<n;j++)
        {
            arraynode[j].key=a[j];
            arraynode[j].next=&arraynode[j+1];

        }
        arraynode[j-1].next=NULL;//创建一个完整的链表
        //对arraynode链表的节点进行分配处理
          for(level=1;level<=2;level++)
          {
              while(arraynode!=NULL)
             {
                      pnode=arraynode->next;
                      Arrange(arraynode,group,level);//对每一个节点进行分配
                      arraynode=pnode;
            }
            arraynode=collect(group);//对主关键字进行再次分配处理
        }
        pnode=arraynode;
        j=0;
        while(pnode!=NULL)
        {
            a[j++]=pnode->key;
            pnode=pnode->next;
        }
        free(arraynode);//释放arraynode链表的空间
}
int resolve(int key,int level)//对数据进行划分层次
{
    switch(level)
    {
        case 1: key=key%10;break;//划分为次关键字
        case 2: key=(key%100)/10;break;//求主关键字
    }
    return key;//返回关键字的层次
}
void Arrange(Node*arraynode,Node*group[],int level)//对待排序数据进行分配处理
{
    int index;//链表节点划分层次
    //Node*pnode;
    Node*postnode;//指向最后一个节点的指针
    index=resolve(arraynode->key,level);
    //对group数组进行分配数据
       if(group[index]==NULL)//该分组的为空  进行初始操作
       {
           group[index]=arraynode;
           arraynode->next=NULL;
       }
       else{
          postnode=group[index];
          while(postnode->next!=NULL)
          {
              postnode=postnode->next;
          }
          postnode->next=arraynode;
          arraynode->next=NULL;//一直保持最后一个节点的next指针为空

       }

}
Node*collect(Node*group[])
{
    Node*pnode;
    int i;
    Node*postnode;//指向最后一个节点的指针
    Node*pHead=NULL;//要返回的链表的头节点指针
    //对group数组进行收集操作
      for(i=0;i<RADIX;i++)
      {
          if(group[i]==NULL)
              continue;
            pnode=group[i];//进行赋初值操作
          if(pHead==NULL)
          {
              postnode=pHead=pnode;

          }
          else
          {
              postnode->next=pnode;
              pnode->next=NULL;
          }
          while(postnode->next!=NULL)
          {
              postnode=postnode->next;
          }
          group[i]=NULL;
      }
       return pHead;
}
void Merge_sort(int *a,int i,int j,int*b )//归并排序函数
{
    int k;
    if(i<j)
    {
      k=(i+j)/2;//取得中间的分割边界
      Merge_sort(a,i,k,b);
      Merge_sort(a,k+1,j,b);
      Merge(a,i,k,k+1,j,b);//将分开的数据进行合并
    }
}

void Merge(int*a,int s1,int e1,int s2,int e2,int *b)
{
    int k=s1;
    int i=s1;
    while(s1<=e1&&s2<=e2)//判断两个划分部分是否为空
    {
        if(a[s1]<a[s2])
        b[k++]=a[s1++];
        else
            b[k++]=a[s2++];

    }
    while(s1<=e1)
    {
        b[k++]=a[s1++];
    }
    while(s2<=e2)
    {
        b[k++]=a[s2++];
    }
    k--;//将k的值指向最后一个节点
    while(k>=i)
    {
        a[k]=b[k];
        k--;
    }
}

最后

以上就是安详钢笔为你收集整理的c语言数据结构排序算法汇总的全部内容,希望文章能够帮你解决c语言数据结构排序算法汇总所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(29)

评论列表共有 0 条评论

立即
投稿
返回
顶部