分类: LINUX
2010-07-19 21:26:23
/* * Copyright (c) 2010-~ zhouyongfei * * The source code is released for free distribution under the terms of the GNU General Public License * * * Author: alen Chou * Created Time: 2010年07月18日 星期日 20时05分46秒 * File Name: sort.c * Description: 这个文件是我再复习插入类排序时候写的代码 * */ #include #include /** * 直接插入排序的算法,比较简单的一个算法 * @:r[]需要进行排序的数组,length数组元素的个数 * * */ void InsSort(int r[], int length) { int i,j; /* * 这块为了使用r[0]作为监视哨,所以将r数组统一后移一位 * */ for(i = length;i > 0;i--){ r[i] = r[i-1]; } for(i = 2;i <= length;i++){ r[0] = r[i]; j=i-1; while(r[0] < r[j]){ r[j+1] = r[j]; j = j-1; } r[j+1] = r[0]; } printf("after sort:\n"); for(i = 1;i <= length;i++){ printf("%d ",r[i]); } printf("\n");
for(i = 0;i < length;i++){ r[i] = r[i+1]; } r[length] = length ; } /** * 折半插入排序 * @:r[]需要排序的数组,length数组元素的个数 * * */ void BinSort(int r[],int length) { int x,low,high,mid; int i,j; /** * 这块是为了使用r[0]作为监视哨, * 所以将r数组中的每个元素统一向后移动一位 * * */ for(i = length;i > 0;i--){ r[i] = r[i-1]; } for(i = 2;i <= length;i++){ x = r[i]; low = 1; high = i - 1; while(low <= high){ mid = (low + high)/2; if(x < r[mid]) high = mid - 1; else low = mid + 1; } for(j = i - 1;j >= low; --j) r[j + 1] = r[j]; r[low] = x; } printf("after sort:\n"); for(i = 1;i <= length;i++){ printf("%d ",r[i]); } printf("\n"); } /** * * 对记录数组r做一趟希尔排序,length为数组的长度 * delta为增量 * * */ void ShellInsert(int r[],int length,int delta) {
int i,j;
for(i = length;i > 0;i--){ r[i] = r[i-1]; }
for(i = 1 + delta;i <= length;i++){ if(r[i] < r[i-delta]){ r[0] = r[i]; /** *是在当前序列中找到合适的位置插 * 入,相当于前面的直接插入排序 * * */ for(j = i-delta;j > 0&& r[0] < r[j];j -= delta){ r[j + delta] = r[j];//是在当前序列中找到合适的位置插 //入,相当于前面的直接插入排序 } r[j + delta] = r[0]; } } for(i = 0;i < length;i++){ r[i] = r[i+1]; } r[length] = length ; } /** * 对数组记录r做希尔排序,length为数组元素 * 的个数,delta为增量数组,n为delta的长度 * * */ void ShellSort(int r[],int length,int delta[],int n) { int i,j; for(i = 0;i <= n-1; ++i) ShellInsert(r,length,delta[i]);
printf("after sort:\n"); for(i = 0;i < length;i++){ printf("%d ",r[i]); } printf("\n"); printf("the length is %d\n",length); } int main(int argc, char *argv[]) {
int i; //int arr[] = {48,62,35,77,55,14,35,98}; int arr[] = {46,55,13,42,94,17,5,70,33,22}; int delta[] = {4,2,1}; int length = sizeof(arr)/sizeof(arr[0]); printf("before sort:\n"); for(i = 0;i < length;i++){ printf("%d ",arr[i]); } printf("\n");
//InsSort(arr,length); //BinSort(arr,length);
ShellSort(arr,length,delta,sizeof(delta)/sizeof(delta[0])); return 0; } |