数据结构中常用算法

    xiaoxiao2021-12-14  22

    排序常用的算法有:插入算法(直接插入算法、折半插入算法、希尔算法)、选择算法(简单选择算法、堆排序算法)、快速算法(冒泡排序、快速排序算法)

    以下程序给出了各种算法的实现,其接口为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); }

    转载请注明原文地址: https://ju.6miu.com/read-965683.html

    最新回复(0)