排序常用的算法有:插入算法(直接插入算法、折半插入算法、希尔算法)、选择算法(简单选择算法、堆排序算法)、快速算法(冒泡排序、快速排序算法)
以下程序给出了各种算法的实现,其接口为void sort(int *array,int len),每个文件实现一个算法, 最后和main.c文件编译实现。
1、直接插入算法:
//direct_insert_sort.c
[cpp] view plaincopy
- 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
[cpp] view plaincopy
- 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
[cpp] view plaincopy
- 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
[cpp] view plaincopy
- 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
[cpp] view plaincopy
- 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
[cpp] view plaincopy
- 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
[cpp] view plaincopy
- 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文件一起编译即可生成目标文件
[cpp] view plaincopy
- #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);
- }
时间: 2024-10-10 15:30:50