数组排序希尔排序算法知识总结
发一下牢骚和主题无关:
希尔排序算法思惟:
为了易于解理,把要排序的数成当一系列整数,让这些整数成组一个长度为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说"程序员的未来就是榨取程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问侯捷,他写的计算机书的读者可能是地球上最多的"
于是他去问侯捷。
侯捷说"程序员的未来就是诱惑程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝摇摇头"唉,我的孩子,你还是别当程序员了")