本文主要是介绍一日一码05--希尔排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
坚持真的是最难的事,上次写代码已经是十几天之前了。
//希尔排序 2013/09/22#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <malloc.h>//path为步长,正常的插入排序调用是insertSort(a,n,0,1)
void insertSort(int* a,int n, int start, int path){int i,j,t;for (i=start + path ; i < n ; i += path){t = a[i]; //我错写成过t = a[j]for( j = i; j >= start + path && t < a[j-path]; j -= path){a[j] = a[j - path];}a[j] = t;}
}//shell排序本质上是分组的插入排序
//通过比较相隔较远距离(称为增量或步长)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换
void shellSort(int* a,int n){int start;int path;//初次步长设为n/2,每次循环步长减半,直到为1for(path = n/2; path > 0; path /= 2){for(start = 0; start < path; start++){//调用插入排序insertSort(a,n,start,path);}}
}void initArr(int* a, int n){int i;srand(time(NULL));for(i = 0; i < n; i++){a[i] = rand()%100;}
}void printArr(int* a, int n){int i;for (i = 0;i < n; i++){printf("%d,",a[i]);}printf("\n");
}void main(){int* arr;int n;printf("Input the size of array:");scanf("%d",&n);arr = (int *)malloc(n*sizeof(int));initArr(arr,n);printArr(arr,n);shellSort(arr,n);printArr(arr,n);}
这篇关于一日一码05--希尔排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!