在比较笨的方法是插入交换排序代码为:
protected void sort() {
for(int begin=1;begin<Array.length;begin++) {
int cur=begin;
while(cur>0&&cmp(cur,cur-1)<0) {
swap(cur,cur-1);
cur--;
}
}
}
解读一下:这里的是先把要插的数进行备份,但此时5位置上还是有要插的数据的,这里的代码cmp(v,array[cur-1])<0,成立的条件只有位置在 4,5这种情况符合条件,此时的4上的位置的值是比5大的,其他的都是前面的比后面的大,则此时才会进入while循环,在会进行4位置与5位置互换,此时不要考虑array的大小若是个动态数组则就会自动增加,此时的的array.length就为6了,在这里的cur是为了保存原来的design的路径为了方便在下面3位置与4位置交换。
优化的是先将要比较的这个数进行拿出来,与前面的数进行比较若前面的是比较大的就让他往后面移动一位,而不是交换了。其中的上面的swap里面包含三行代码,而这里就只有一行代码了,运行时间减少了。
二分法查找的方法。
查找v在有序数组array中的位置,有则返回,没有则返回-1。
public class W {
public static int indexOf(int[] array,int v) {
if(array==null||array.length==0)return -1;
int begin=0;
int end =array.length;
while(begin<end) {
int mid=(begin+end)>>1;
if(v<array[mid]) {
end=mid;
}else if(v>array[mid]) {
begin=mid+1;
}else {
return mid;
}
}
return -1;
}
查找v在数组array中将要插入的位置,返回这个位置。
public static int search(int[] array,int v) {
if(array==null||array.length==0)return -1;
int begin=0;
int end=array.length;
while(begin<end) {
int mid=(begin+end)>>1;
if(v<array[mid]) {
end=mid;
}else {
begin=mid+1;
}
}
return begin;
}
在这里面用的是位运算。这样会节省运算,在这里求出来的mid为4.5的时候因为他是整形所以就是取值4,在这里我们先int end=array.length;把他等于最后一个数组最后一个数此时这里面是没有数据的。这里最后的是返回一个return begin