常用的6种排序C语言实现

原创 2013年12月04日 23:50:20

1.冒泡排序:

思想是:依次比较数组的每一项,将最大(最小)的值往后移动,每次都把数组中当前没排序的最大(最小)值排到相对(下面程序的J后)最后。

void ballon_sort(int *arry,int len)//参数为数组地址和数组长度
{
    int i;
    int j;
    int temp;
    for(i=0;i<len;i++)
    {
       for(j=1;j<len-i;j++)
       {
         if(arry[j]<arry[j-1])
         {
            temp=arry[j];
            arry[j]=arry[j-1];
            arry[j-1]=temp;
         }
       }
    }
}

2.选择排序:

思想是:从后面选出比当前下标(下面程序对应的i)对应数组值还小(大)的值交换到前面

void sort(int *arry,int len)//参数为数组地址和数组长度
{
    int i,j;
    int temp;
    for(i=0;i<len-1;i++)
    {
      for(j=i+1;j<len;j++)
      {
         if(arry[i]>arry[j])
         {
             temp=arry[i];
             arry[i]=arry[j];
             arry[j]=temp;
         }
      }
    }
}


3.插入排序:

思想是:假定前面i个数是排好序的,从余下没排好的元素中选择一个元素(排好的下一个)来与前面排好序的比较,找到位置并插入。

void insert_sort(int *arry,int len)//参数为数组地址和数组长度
{
   int i;
   int j;
   int temp;
   for(i=0;i<len-1;i++)
   {
      for( j=i+1;j>0;j--)
      {
          if(arry[j]<arry[j-1])
          {
            temp=arry[j];
            arry[j]=arry[j-1];
            arry[j-1]=temp;
          }
      }
   }
}
4.快速排序:本程序是二分快排,尽量使每次都二分

思想是:先确定一个比较值(本程序选的是中间),然后从前面找个比他大(小),后面找个比他小(大)的,然后交换这个两个找出来的值,最终大(小)于目标值的都到了前面,小(大)于目标值的都到了后面,目标值的位置自动确定了。

void quick_sort(int *arry,int left,int right)//参数为数组,左下标,右下标
{
     int i=left-1;
     int j=right+1;
     int temp;
     int mid;
     int mid_num;
     if(left<right)//防止在递归时到了left=right时还继续
     {
        mid=arry[(i+j)/2];//中间值
        mid_num=(i+j)/2;
       while(i<j)//其实这里的停止条件是i==j,因为左右都是向中间归的
       {
         while(i<mid_num&&arry[++i]<mid);//找左边相对不满足从小到大的元素
         while(j>mid_num&&arry[--j]>mid);//同上
         printf("i=%d,j=%d\n",i,j);
         if(i!=j)
         {
         temp=arry[i];
         arry[i]=arry[j];
         arry[j]=temp;
         }
       }
       //此时已经确定了中间元素的位置,应该拆分成更小的继续确定更小的
       printf("left\n");
       quick_sort(arry,left,i-1);
       printf("right\n");
       quick_sort(arry,j+1,right);
     }
}

5.归并排序:

思想是:先将数组二分,分别排序,然后将排序好的合成一个(只要一层for循环就可以了),这样可以降低排序的循环次数。

void arry_merger(int *arry,int left,int mid,int right)
{
     //本函数的组合思想是:先生成一个临时数组,再把分开两部分按从小到大的顺序放到临时数组中去,最后把临时数组复制给原数组
     int i=left;
     int j=mid+1;
     int m=0;
     int *temp_arry=(int*)malloc(sizeof(int)*(right-left+1));
     if(temp_arry==NULL)
     {
        printf("Out of memery !\n");
        exit(-1);
     }
     while(i<=mid&&j<=right)//本while部分是把数组中的两部分数按从小到大放到临时数组中去
     {
         if(arry[i]<arry[j])
         {
            temp_arry[m++]=arry[i++];
         }else
         {
            temp_arry[m++]=arry[j++];
         }
     }
     for(i;i<=mid;i++)
     {
        temp_arry[m++]=arry[i];
     }
     for(j;j<=right;j++)
     {
        temp_arry[m++]=arry[j];
     }
     for(i=left,m=0;i<=right;i++,m++)
     {
         arry[i]=temp_arry[m];
     }
     free(temp_arry);
}
void arry_split(int *arry,int left,int right)//本函数是函数调用的入口
 {
      int mid;
      if(left<right)//进行二分,直到都分成单的
      {
         mid=(left+right)/2;
         printf("left= %d, mid= %d right = %d\n",left,mid,right);
         arry_split(arry,left,mid);//左分
         arry_split(arry,mid+1,right);//右分
         arry_merger(arry,left,mid,right);//分了之后组合
      }
}

6.堆排序:

//堆排序的主要思想是先建立堆,然后每次交换堆顶元素交换到最后,
//并且把最后的元素不算到数组内,并调整数组
void adjust(int *arry,int adjust_point,int size)
{
     int left,right,position;
     int temp;
     while(size>2*adjust_point+1)
     {
         position=adjust_point;
         left=adjust_point*2+1;
         if(left<size&&arry[position]<arry[left])
         {
             position=left;
         }
         right=left+1;
         if(right<size&&arry[position]<arry[right])
         {
             position=right;
         }
         if(position!=adjust_point)//选出最大的交换到前面
         {
             temp=arry[adjust_point];
             arry[adjust_point]=arry[position];
             arry[position]=temp;
             adjust_point=position;//改变过的堆要从新检测
         }
         else//由于后面的已经排好了,每次只要排好自己的就可以了
         {
            break;
         }
     }
}
void heap_sort(int *arry,int size)
{
    int root;
    int j;
    int temp;
    root=size/2;
    //从后向前建立堆,这样可以把最大的或最小的调整到最前面
    for(j=root-1;j>=0;j--)
    {
       adjust(arry,j,size);
    }
    j=size;
    while(j>0)
    {
       temp=arry[0];
       arry[0]=arry[j-1];
       arry[j-1]=temp;
       j--;
       adjust(arry,0,j);//调整被改变过的,从前往后调整,只要前面不动,后面一直都满足堆的条件
    }
}
加快排序速度的思想是:尽量减少第二层循环的次数。

数据结构6种内部排序算法的比较

1、需求分析(1)输入数据的形式为:伪随机数产生程序产生,且每次输入数不少于100个,至少要用5组不同的输入数据(2)输出的形式为:输出关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动)...
  • xu_Melon
  • xu_Melon
  • 2017年03月19日 10:46
  • 735

6种常见排序算法(java版)

1、排序算法基本概念1.1、什么是排序算法所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相...
  • linpeng123l
  • linpeng123l
  • 2016年08月25日 20:25
  • 1361

6种排序的lua实现

require"math" -- straight insertion sort a = {3,1,8,4,5,2,7,9,6} local b = function()     local ...
  • szzzzj
  • szzzzj
  • 2017年12月07日 09:49
  • 6

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

写在前面:                  排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。因此排序掌握各种排序算法非常重要。...
  • aboluo321321
  • aboluo321321
  • 2014年07月17日 00:36
  • 2462

十种常见排序算法

1.常见算法分类 十种常见排序算法一般分为以下几种: (1)线性时间比较类排序:交换类排序(快速排序和冒泡排序)、插入类排序(简单插入排序和希尔排序)、选择类排序(简单选择排序和堆排序)、归并排序...
  • K346K346
  • K346K346
  • 2016年03月04日 22:59
  • 7947

【数据结构】几种常见的排序算法

一、排序算法的分类     下图是我掌握的一些排序算法,我将他们做了分类,当然,排序算法远不止这些。 本篇博客主要记录插入,选择,以及交换排序的冒泡排序,因为快排和归并算法相对复杂,所以,...
  • pointer_y
  • pointer_y
  • 2016年11月26日 23:06
  • 1393

常见的几种排序方法

我们以数组a[ ]={2,6,8,9,1,2}进行排序输出作为列子:下面我来总结几种方法来帮助大家学习 1:常规排序        首先2和6对比,2不比6大不因此不交换,所以还是268912...
  • Hallo_ween
  • Hallo_ween
  • 2016年08月03日 18:28
  • 783

6种基本排序(C++实现)

排序算法
  • qq_33515088
  • qq_33515088
  • 2017年12月27日 18:49
  • 46

七大常见排序算法总结

插入类排序 直接插入排序 希尔排序 选择类排序 简单选择排序 堆排序 交换类排序 冒泡排序 快速排序 归并类排序 归并排序...
  • lutianfeiml
  • lutianfeiml
  • 2016年07月19日 19:56
  • 4829

Android的6种布局管理器总结

Android中的6大布局管理器:1). LinearLayout 线性布局管理器、2). TableLayout 表格布局管理器、3). RelativeLayout 相对布局管理器、4). Fra...
  • yihuiworld
  • yihuiworld
  • 2015年05月26日 17:31
  • 9406
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:常用的6种排序C语言实现
举报原因:
原因补充:

(最多只允许输入30个字)