数据结构中常用算法
2016-12-02 16:55
423 查看
排序常用的算法有:插入算法(直接插入算法、折半插入算法、希尔算法)、选择算法(简单选择算法、堆排序算法)、快速算法(冒泡排序、快速排序算法)
以下程序给出了各种算法的实现,其接口为void sort(int *array,int len),每个文件实现一个算法, 最后和main.c文件编译实现。
1、直接插入算法:
//direct_insert_sort.c
void sort(int *array,int len)
{
int tmp,i,j;
for(i=1;i<len;i++)
{
if(array[i]<array[i-1])
{
tmp = array[i];
for(j=i-1;j>=0;j--)
{
if(array[j]>tmp)
array[j+1]=array[j];
else
break;
}
array[j+1]=tmp;
}
}
}
2、折半插入排序
//binary_insert_sort.c
3、希尔排序
//shell_sort.c
void sort(int *array,int len)
{
int tmp,i,j,gap;
gap = len ;
do
{
gap = gap / 3 + 1;
for(i=0+gap;i<len;i++)
{
if(array[i]<array[i-gap])
{
tmp = array[i];
for(j=i-gap;j>=0;j=j-gap)
if(array[j]>tmp)
array[j+gap]=array[j];
else
break;
array[j+gap]=tmp;
}
}
}while(gap > 1);
}
4、简单选择排序
//simple_select_sort
5、堆排序
//heap_sort.c
6、冒泡排序
//bubble_sort.c
7、快速排序
//quick_sort.c
8、主函数main.c 上面的文件分别单独和main.c文件一起编译即可生成目标文件
#include<stdio.h>
extern void sort(int *array,int len);
void print(const int *array,int len)
{
int i;
for(i=0;i<5;i++)
printf("%d ",array[i]);
putchar('\n');
}
int main()
{
int i;
printf("please input 5 integer numbers\n");
int array[5];
fflush(stdin);
for(i=0;i<5;i++)
scanf("%d",array+i);
printf("\nold order is:\n");
print(array,5);
sort(array,5);
printf("\n new order is:\n");
print(array,5);
}
以下程序给出了各种算法的实现,其接口为void sort(int *array,int len),每个文件实现一个算法, 最后和main.c文件编译实现。
1、直接插入算法:
//direct_insert_sort.c
void sort(int *array,int len)
{
int tmp,i,j;
for(i=1;i<len;i++)
{
if(array[i]<array[i-1])
{
tmp = array[i];
for(j=i-1;j>=0;j--)
{
if(array[j]>tmp)
array[j+1]=array[j];
else
break;
}
array[j+1]=tmp;
}
}
}
2、折半插入排序
//binary_insert_sort.c
void sort(int *array,int len) { int low,m,high; int i,tmp,j; for(i=1;i<len;i++) { if(array[i]<array[i-1]) { tmp = array[i]; low = 0; high = i-1; while(low <= high) { m=(low+high)/2; if(array[m]>=tmp) high = m-1; else low = m +1; } for(j=i-1;j>=low;j--) { array[j+1]=array[j]; } array[low]=tmp; } } }
3、希尔排序
//shell_sort.c
void sort(int *array,int len)
{
int tmp,i,j,gap;
gap = len ;
do
{
gap = gap / 3 + 1;
for(i=0+gap;i<len;i++)
{
if(array[i]<array[i-gap])
{
tmp = array[i];
for(j=i-gap;j>=0;j=j-gap)
if(array[j]>tmp)
array[j+gap]=array[j];
else
break;
array[j+gap]=tmp;
}
}
}while(gap > 1);
}
4、简单选择排序
//simple_select_sort
void sort(int *array,int len) { int i,j,min,tmp; for(i=0;i<len-1;i++) { min= i; for(j=i+1;j<len;j++) if(array[j]<array[min]) min=j; if(i != min) { tmp=array[i]; array[i]=array[min]; array[min]=tmp; } } }
5、堆排序
//heap_sort.c
static void heapAdjust(int * array 4000 ,int start,int end); void sort(int *array,int len) { int i,j; for(i=len/2;i>=0;i--) heapAdjust(array,i,len-1); for(i=len-1;i>0;i--) { int tmp=array[i]; array[i]=array[0]; array[0]=tmp; heapAdjust(array,0,i-1); } } static void heapAdjust(int * array,int start,int end) { int i; int tmp = array[start]; for(i=2*start+1;i<=end;i=2*i+1) { if(array[i]<array[i+1]&& i<end) i++; if(tmp > array[i]) break; array[start]=array[i]; start = i; } array[start]=tmp; }
6、冒泡排序
//bubble_sort.c
void sort(int * array,int len) { int i,j,tmp; for(i=1;i<len;i++) { for(j=0;j<len-1;j++) if(array[j]>array[j+1]) { tmp = array[j+1]; array[j+1]=array[j]; array[j]=tmp; } } }
7、快速排序
//quick_sort.c
static int partition(int *array,int low,int high); static void quickSort(int *array,int start,int end); void sort(int *array,int len) { quickSort(array,0,len-1); } static void quickSort(int *array,int start,int end) { if(start < end) { int pivotloc = partition(array,start,end); quickSort(array,start,pivotloc-1); quickSort(array,pivotloc+1,end); } } static int partition(int *array,int low,int high) { int i,j,tmp; tmp = array[low]; while(low < high) { while(low<high && array[high]>tmp) high--; array[low]=array[high]; while(low<high && array[low]<tmp) low++; array[high]=array[low]; } array[low]=tmp; return low; }
8、主函数main.c 上面的文件分别单独和main.c文件一起编译即可生成目标文件
#include<stdio.h>
extern void sort(int *array,int len);
void print(const int *array,int len)
{
int i;
for(i=0;i<5;i++)
printf("%d ",array[i]);
putchar('\n');
}
int main()
{
int i;
printf("please input 5 integer numbers\n");
int array[5];
fflush(stdin);
for(i=0;i<5;i++)
scanf("%d",array+i);
printf("\nold order is:\n");
print(array,5);
sort(array,5);
printf("\n new order is:\n");
print(array,5);
}
相关文章推荐
- 数据结构图的常用算法总结
- c/c++常用算法(1) -- 数据结构(线性表的顺序存储)
- 数据结构——图常用算法实现(DFS,BFS,最小生成树,最短路径,拓扑序列)
- Android 数据结构以及常用的算法
- 常用查找数据结构及算法
- 数据结构中一些常用的算法
- 大数据日知录【第三章:常用数据结构与算法】笔记
- 【数据结构与算法】二叉搜索树 及 常用操作
- 常用查找数据结构及算法(Python实现)
- 常用查找数据结构及算法(Python实现)
- 工程实践中最常用的10大数据结构与算法
- [数据结构与算法]常用排序算法的动画效果图
- linux常用c函数 数据结构及算法篇
- Android 数据结构以及常用的算法
- [算法]数据结构中关于货郎担路径问题的常用解法,边界路径问题
- acm 常用数据结构与算法专题(未分类均放于此)
- linux 内核常用数据结构及算法——list(循环双向链表)
- 再回首,数据结构——树和二叉树的常用算法
- 数据结构基础篇(3)--算法时间复杂度的常用算法
- libcstl:标准C语言通用数据结构和常用算法库