資料結構中常用演算法
阿新 • • 發佈:2019-01-31
排序常用的演算法有:插入演算法(直接插入演算法、折半插入演算法、希爾演算法)、選擇演算法(簡單選擇演算法、堆排序演算法)、快速演算法(氣泡排序、快速排序演算法)
以下程式給出了各種演算法的實現,其介面為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,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);
}