在这里将常见的排序算法进行一个总结,包括直接插入排序,折半插入排序,希尔排序,冒泡排序,快速排序。至于这些排序算法的实现原理,很多大牛写的都很详细,感觉望尘莫及,所以就不多写了,只是将自己写的源码发出来,希望大家共同学习。
/*
********************************************************************************
** 模块名称 : 排序函数
** 文件名称 : 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************************************/