排序算法的C语言实现

在这里将常见的排序算法进行一个总结,包括直接插入排序,折半插入排序,希尔排序,冒泡排序,快速排序。至于这些排序算法的实现原理,很多大牛写的都很详细,感觉望尘莫及,所以就不多写了,只是将自己写的源码发出来,希望大家共同学习。

/*
********************************************************************************                                   
** 模块名称 : 排序函数 
** 文件名称 : sort.c 
** 开发环境 : Dev-C++(32位)
** 版    本 : ver0.1
** 说    明 : 常见排序算法的C语言实现 
** 版本号  日期        作者      说明
** V0.1    2015-10-06  holi
**
** Email    : holi2018@qq.com
********************************************************************************
*/

/** 引用头文件 *****************************************************************/
#include<stdio.h>

/** 私有数据类型 ***************************************************************/
/** 私有宏**********************************************************************/
#define OK 1
#define ERROR 0
#define LEN 10

/** 私有函数声明 ***************************************************************/
void insertSort(int array[], int len);          //直接插入排序 
void binaryInsortSort(int array[], int len);    //折半插入排序 
void shellSort(int array[], int len);           //希尔排序 
void bubbleSort(int array[], int len);          //冒泡排序 
void quickSort(int array[], int len);           //快速排序
void printArray(int array[], int len);          //打印数组 


/** 私有函数  ******************************************************************/
/*
*********************************************************************************
** 函数名称: insertSort 
** 功能描述: 直接插入排序 
** 参    数: int array[], int len
** 返 回 值: 无 
** 使用说明:
** 调用方法:
**********************************************************************************
*/
void insertSort(int array[], int len){
    int i = 0, j = 0;
    int key = 0;
    for(i = 1; i < len; i++){
        if(array[i] < array[i-1]){
            key = array[i];
            for(j = i - 1; j >= 0 && key < array[j]; --j)   //从后往前查找待插入位置 
                  array[j+1] = array[j];        //向后挪位 
            array[j+1] = key;     
        }   
    } 
}

/*
*********************************************************************************
** 函数名称: binaryInsertSort 
** 功能描述: 折半插入排序 
** 参    数: int array[], int len
** 返 回 值: 无 
** 使用说明:
** 调用方法:
**********************************************************************************
*/
void binaryInsertSort(int array[], int len){
    int i = 0, j = 0, low = 0, high =0, mid =0;
    int key = 0;
    for(i = 1; i <= len; i++){
        key = array[i];
        low = 0;
        high = i - 1;   //设置折半查找的范围
        while(low <= high){
            mid = (low + high) / 2; 
            if(array[mid] > key)        
                high = mid - 1;     //查左半子表 
            else low = mid + 1;     //查右半子表 
        } 
        for(j = i - 1; j >= high + 1; --j)
              array[j + 1] = array[j];
        array[high + 1] = key;
    }
}

/*
*********************************************************************************
** 函数名称: shellSort 
** 功能描述: 希尔排序 
** 参    数: int array[], int len
** 返 回 值: 无 
** 使用说明:
** 调用方法:
**********************************************************************************
*/
void shellSort(int array[], int len){
    int i = 0, j = 0, dk = 0; //dk为前后记录位置的增量
    int key = 0;
    for(dk = len / 2; dk >= 1; dk = dk / 2){
        for(i = dk; i <= len; ++i)
            if(array[i] < array [i-dk]){
                key = array[i];
                for(j = i - dk; j >= 0 && key < array[j]; j = j - dk)
                      array[j+dk] = array[j];
                array[j+dk] = key;  
            }
    } 
}

/*
*********************************************************************************
** 函数名称: bubbleSort 
** 功能描述: 冒泡排序 
** 参    数: int array[], int len
** 返 回 值: 无 
** 使用说明:
** 调用方法:
**********************************************************************************
*/
void bubbleSort(int array[], int len){
    int i = 0, j = 0;
    int temp = 0;
    int flag = 0;
    for(i = 0; i < len - 1; i++){
        flag = 0;
        for(j = 0; j < len - i - 1; j++){
                    if(array[j] > array[j+1]){
                        flag = 1;
                        temp = array[j];
                        array[j] = array[j+1];
                        array[j+1] = temp;
                      }
        }
        if(0 == flag)
             break;     
    }         
}

/*
*********************************************************************************
** 函数名称: quickSort 
** 功能描述: 快速排序 
** 参    数: int array[], int len
** 返 回 值: 无 
** 使用说明:
** 调用方法:
**********************************************************************************
*/
void quickSort(int array[], int len){
    int low = 0, high = len - 1;
    int pivot =array[0];            //pivot为枢值,对表进行划分
    static counter = 1;
    while(low < high){      //递归的跳出条件 
        while(low < high && array[high] >= pivot)
                  --high;   
        array[low] = array[high];//将比枢值小的元素移动到左端 
        while(low < high && array[low] <= pivot)
                  ++low;    
        array[high] = array[low];//将比枢值大的元素移动到右端      
        array[low] = pivot; //将枢元素放到最终位置 

        //对两个子表进行递归排序 
        quickSort(array, high+1); 
        quickSort(&array[high+1], len - high - 1);          
    }
}


/*
*********************************************************************************
** 函数名称: printArray 
** 功能描述: 打印数组元素 
** 参    数: int array[], int len
** 返 回 值: 无 
** 使用说明:
** 调用方法:
**********************************************************************************
*/
void printArray(int array[], int len){
     int i = 0;
     for(i = 0; i < len; i++){
        printf("%d ", array[i]);
     }
     printf("\n");
}

/*
*********************************************************************************
** 函数名称: main
** 功能描述: 主函数 
** 参    数: 无 
** 返 回 值: 1:OK  0:ERROR 
** 使用说明:
** 调用方法:
**********************************************************************************
*/
int main( void){
    int array[LEN] = {10, 0, 8,7, 6, 0, 4, 3, 2, 1};
    printArray(array, LEN);
    //insertSort(array, LEN);
    binaryInsertSort(array, LEN);
    //shellSort(array, LEN);
    //bubbleSort(array, LEN);
    //quickSort(array,LEN);
    printArray(array, LEN); 

    return OK;
} 
/**********************************END OF FILE************************************/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值