常用排序算法的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语言版)》 严蔚敏 吴伟民 著 清华大学出版社
没有按数据结构上的定义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语言版)》 严蔚敏 吴伟民 著 清华大学出版社
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- JavaScript演示排序算法
- 如何写好 C main 函数
- C#数据结构之顺序表(SeqList)实例详解
- Lua和C语言的交互详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法