发一下牢骚和主题无关:
希尔排序算法思惟:
为了易于解理,把要排序的数成当一系列整数,让这些整数成组一个长度为n(n为这些要排序的整数的个数)的数组为例来说明。取一个小于要排序的字数的个数n的整数a,把要排序的字数分红a个小数组(这些小数组中的素元由原数组中全部离距为a和a的倍数的位置处的整数成组),然后对这些小数组停止。成完后之,再取一个整数a1(a1<a),然后重复面上的操纵,即停止组分和直接插入排序,直到at=1(at<at-1<···a2<a1)即全部的整数放在同一个数组中停止直接插入排序为止。简而言之,就是一种组分的直接插入排序方法。
希尔排序的进程如下:
比如对面上的整数停止希尔排序为例来说明:
2,4,1,3
这些整数的个数为n=4,用即是2的整数a1(a1=n/2)把这些数分割成两部分,分割的方法就是:将相隔2个数的离距的整数分配到一个数组。因此可以等到两个数组{2,1}
和{4,3},对这两个数组停止直接插入排序后为{1,2}和{3,4},这样它们原数列中的次序就变成了:1,3,2,4
然后让a2=a1/2=1,续继对前当的数列停止排序,于是就把前当的数列分红了一个新的数组(距离一个素元的离距成组的数组){1,3,2,4}然后对这个数组停止直接插入排序,于是就变成了1,2,3,4,此时a2=1,排序终了。
希尔排序核心码代如下:
public void shellSort(int[] arr){ int temp;//定义一个临时值 boolean isChange;//断判数组中素元的排列次序是不是有化变,如果有化变,就把前当数组中的素元打印出来 int splitLength;//定义数组中要排序的素元的距离离距 int point;//找出前当要排序的素元的位置,即该素元在数组中位置的下标值 splitLength=(int)arr.length/2;//定规距离长度 while(splitLength!=0){//如果距离长度不为0 /**面上的for循环的作用是 */ for(int i=splitLength;i<arr.length;i++){ isChange=false;//置设isChange的初始值为false temp=arr[i];//让 point=i-splitLength; while(temp<arr[point]&&point>=0&&point<=arr.length){//如果第一个值比面后的值大 arr[point+splitLength]=arr[point];//把这个素元放在面后的位置 point=point-splitLength; isChange=true; if(point<0||point>arr.length){ break; } } arr[point+splitLength]=temp; if(isChange){ System.out.print("排序中:"); for(int j=0;j<arr.length;j++){ System.out.printf("%3s", arr[j]); } System.out.println(""); } } splitLength=splitLength/2; } System.out.println("希尔排序成完!"); }
举例说明如下:
package AlgorithmTest;
/** * * @author Administrator */ public class ShellSortTest { public static void main(String args[]){ int[] a={2,4,1,3}; ShellSortTest sst=new ShellSortTest(); sst.shellSort(a); } public void shellSort(int[] arr){ int temp;//定义一个临时值 boolean isChange;//断判数组中素元的排列次序是不是有化变,如果有化变,就把前当数组中的素元打印出来 int splitLength;//定义数组中要排序的素元的距离离距 int point;//找出前当要排序的素元的位置,即该素元在数组中位置的下标值 splitLength=(int)arr.length/2;//定规距离长度 while(splitLength!=0){//如果距离长度不为0 /**面上的for循环的作用是 */ for(int i=splitLength;i<arr.length;i++){ isChange=false;//置设isChange的初始值为false temp=arr[i];//让 point=i-splitLength; while(temp<arr[point]&&point>=0&&point<=arr.length){//如果第一个值比面后的值大 arr[point+splitLength]=arr[point];//把这个素元放在面后的位置 point=point-splitLength; isChange=true; if(point<0||point>arr.length){ break; } } arr[point+splitLength]=temp; if(isChange){ System.out.print("排序中:"); for(int j=0;j<arr.length;j++){ System.out.printf("%3s", arr[j]); } System.out.println(""); } } splitLength=splitLength/2; } System.out.println("希尔排序成完!"); showArray(arr); System.out.println(); } public void showArray(int[] arr){ for(int i=0;i<arr.length;i++){ System.out.print(arr[i]+" "); } } }
文章结束给大家分享下程序员的一些笑话语录: 一个程序员对自己的未来很迷茫,于是去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?" 上帝说"我的孩子,你去问Lippman,他现在领导的程序员的队伍可能是地球上最大的" 于是他去问Lippman。 Lippman说"程序员的未来就是驾驭程序员" 这个程序员对这个未来不满意,于是他又去问上帝。 "万能的上帝呀,请你告诉我,我的未来会怎样?" 上帝说"我的孩子,你去问Gates,他现在所拥有的财产可能是地球上最多的" 于是他去问Gates。 Gates说"程序员的未来就是榨取程序员" 这个程序员对这个未来不满意,于是他又去问上帝。 "万能的上帝呀,请你告诉我,我的未来会怎样?" 上帝说"我的孩子,你去问侯捷,他写的计算机书的读者可能是地球上最多的" 于是他去问侯捷。 侯捷说"程序员的未来就是诱惑程序员" 这个程序员对这个未来不满意,于是他又去问上帝。 "万能的上帝呀,请你告诉我,我的未来会怎样?" 上帝摇摇头"唉,我的孩子,你还是别当程序员了")