基本排序算法的C语言实现

1、摘要
       历次找工作,经常会被要求写排序算法,每次都写冒泡排序,而且每次都很心虚。不是因为怕写的不对,而是因为自己的数据结构、算法基本功不扎实。越来越觉得这些重要,不仅仅是理解原理那么简单,而是觉得应该自己能够随手实现它们,最少能够实现一个大概。
       本文实现几种内排序。接下来会依次实现其他一些算法。
2、排序算法实现
       这个页面介绍了排序是什么,以及简单提到了内排序和外排序的区别。而 这篇文章则详细介绍了几种排序的思想,并给出了Pascal语言的实现。
常见内排序包括插入排序、冒泡排序、快速排序、直接选择排序、堆排序、希尔排序和归并排序等。其中 快速排序则为这些排序中的大牌明星,其平均效率远低于其他排序方法。
       下面列出几个排序算法的C语言实现,以便日后查阅。
l         冒泡排序
void bubblesort(int ori[], int len)
{
    int i, j;
    for (i = 0; i < len; i++)
    {
        for (j = 0; j < len - i - 1; j++)
        {
            if (ori[j] > ori[j + 1])
            {
                swap(&ori[j], &ori[j + 1]);
            }   
        }   
    }   
}   
l         插入排序
void insertsort(int ori[], int len)
{
    int i, j, tmp;
    for (i = 1; i < len; i++)
    {
        tmp = ori[i];
       
        j = i;
        while (j > 0 && tmp < ori[j - 1])
        {
            ori[j] = ori[j - 1];
            j--;
        }   
        ori[j] = tmp;
    }   
}   
l         直接选择排序
void selectsort(int ori[], int len)
{
    int i, j, tmp;
    for (i = 0; i < len; i++)
    {
        for (j = i + 1; j < len; j++)
        {
            if (ori[i] > ori[j])
            {
                swap(&ori[i], &ori[j]);
            }   
        }   
    }   
}  
l         快速排序
快速排序稍微复杂一点,用到两个函数,其中getpivot函数的功能是获取支点元素,该元素从数组首尾以及中间位置的数中获取,获取规则是将这三个数排序,取中间值。需要注意的是这三个数被排序以后,最大的放在数组最后,最小的放在数组最前,而中间那个数则和倒数第二个数交换位置。
void quicksort(int data[], int start, int end)
{
    int i, j, pivot;
 
    if (start + 3 <= end)
    {
         pivot = getpivot(data, start, end);
         i = start;
         j = end - 1;
        
         for ( ; ; )
         {
             while (data[++i] < pivot);
             while (data[--j] > pivot);
             if (i < j)
             {
                 swap(&data[i], &data[j]);
             }   
             else
              break;
         }   
         swap(&data[i], &data[end - 1]);
        
         quicksort(data, start, i - 1);
         quicksort(data, i + 1, end);
    }   
    else
    {
        bubblesort(&data[start], end - start + 1);
    }   
   
}
 
static int getpivot(int data[], int start, int end)
{
    int mid = (start + end) / 2;
   
    data[start] > data[mid] ? swap(&data[start], &data[mid]) : NULL;
    data[start] > data[end] ? swap(&data[start], &data[end]) : NULL;
    data[mid] > data[end] ? swap(&data[mid], &data[end]) : NULL;
   
    swap(&data[mid], &data[end - 1]);
    return data[end - 1];
}
以上函数用到swap函数,用于交换两个数的值。
static void swap(int *a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
3、作者手记
作者:悠乐, 青娱乐开发工程师。
4、更新日志
5、参考文档
6、相关文档
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值