您的位置:首页 > 编程语言 > C语言/C++

常用排序算法的C语言实现

2016-05-10 12:43 1031 查看
最近看数据结构,把常用的排序算法用C语言写了一下。

没有按数据结构上的定义SqList结构体,只是用数组的形式实现

有的算法并没有完全按书上给出的算法,但思路一致。

#include<stdio.h>
void InsertSort(int[], int); //直接插入排序 无哨兵
void BInsertSort(int[], int); //折半插入排序
void BubbleSort(int[], int); //起泡排序
void QSort(int[], int, int); //快速排序
void SelectSort(int[], int); //简单选择排序

int main(){
//int num[] = {12,23,21,23,123,21,2,221,12,44};
int num[] = {4,3,6,7,2,13,21,9,8,34};
//int num[] = {38,65,97,76,13,27,49}; //快排使用
int i;
int len = 10;

//InsertSort(num, len);
//BInsertSort(num, len);
//BubbleSort(num, len);
//len = 7;
//QSort(num, 0, len-1);
//SelectSort(num, len);

for(i=0; i<len;i++)
{
printf("%d ", num[i]);
}
printf("\n");
return 0;
}

//直接插入排序,前i个数保持有序
void InsertSort(int num[], int len)
{ //直接插入排序 无哨兵
int i,j,temp;
for(i=1; i<len; i++){
temp = num[i];
for(j=i; j>0; j--)
{
if(temp < num[j-1]){
num[j] = num[j-1];
}else{
break;
}
}
num[j] = temp;
}
}

//折半插入排序
void BInsertSort(int num[], int len){
int i,j,temp,low,high,mid;
for(i=1; i<len; i++)
{
if(num[i] >= num[i-1]) continue;
temp = num[i];
low = 0;
high = i-1;
mid = (low + high)/2;
while(low <= high)
{
if(num[mid] > temp){
high = mid - 1;
}else
{
low = mid + 1;
}
mid = (low + high)/2;
}
//二分查找完成后,low会指向应插入的位置
for(j=i; j>=low; j--)
{
num[j] = num[j-1];
}
num[low] = temp;
}
}

//起泡排序
void BubbleSort(int num[], int len){
int i, j, temp;
int change = 1;
for(i=len; i>0; i--)
{
if(change == 0) break;
change = 0;
for(j=1; j<i; j++)
{
if(num[j-1] > num[j]){
temp = num[j-1];
num[j-1] = num[j];
num[j] = temp;
change = 1;
}
}
}
}

//快速排序
int Partition(int num[], int low, int high)
{ //一趟快排,返回枢轴位置
int temp = num[low];
while(low < high)
{
while(low<high && num[high] >= temp) --high;
num[low] = num[high];
while(low<high && num[low] <= temp) ++low;
num[high] = num[low];
}
num[low] = temp;
return low;
}
void QSort(int num[], int low, int high)
{ //递归进行快速排序
int pivotloc;
if(low < high){
pivotloc = Partition(num, low, high);
QSort(num, low, pivotloc-1);
QSort(num, pivotloc+1, high);
}
}

//简单选择排序
//算法描述:i:0→len; get minValueTag from [i] to [len-1]; [i]<>[minValueTag];
void SelectSort(int num[], int len){
int i, j, minValueTag, temp;
for(i=0; i<len; i++)
{
minValueTag = i;
for(j=i; j<len; j++)
{
if(num[j] < num[minValueTag]){
minValueTag = j;
}
}
if(minValueTag != i){
temp = num[i];
num[i] = num[minValueTag];
num[minValueTag] = temp;
}
}
}仅供参考,因个人水平及时间有限,文章的错误和不足之处还望指正

参考文献:

        《数据结构(C语言版)》  严蔚敏 吴伟民 著  清华大学出版社
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息