好久没有看算法了,稍微看了下,次哦,变笨了
算法里面最基本的方法:插入排序
假定有一组数据:A1,A2,A3,A4…..An
要求重新排序输出:B1,B2,B3,B4…..Bn 按照从大到小的顺序。
实现方法,假定有数组a[0…n]
1.先认为a[0]是有序的,那么a[1…n]是无序区
2.另i=1,我们把a[i]作为当前的key值插入到a[0…i-1]这个有序区间里面去,形成了有序区间a[0…i]
3.i=i+1,继续把当然的a[i](此时的i已经自加了1,第二步是i=1的话,此时i=2)作为当前的key插入到上一步形成的a[0…i-1]的区间里面,就这样不停的重复第二部,直到i=n.
伪码后面补上!
下面是JAVA代码:
public static int[] sort(int[] num) {
int i, j, key;
for (i = 1; i < num.length; i++) {
// 因为第一个数据我们认为自成有序序列,所以要从第二个位置(下标为1)遍历其他的所有数据,插入这个有序序列,扩充它,直到所有的元素都遍历完
// 记录key值,要把它插入到这个key值前面的有序序列
key = num[i];
for (j = i - 1; j >= 0; j--) {
if (key > num[j]) {// 找到比我们要插入的key值小的数值,这个数值后面的一个位置:j+1就是要把key值插入的位置,此时跳出循环,已经找到要插入的位置了
break;
}
}
if (j != i - 1) {// 判断条件,如果发现我们现在的key值的前一个位置的值就比我们的key值小,那就是说key值不用移动,就和前面的有序序列是保持一致的,不用去插入它,那我们就不需要处理,继续进行这个key后面的数值的处理
for (int k = i; k > j + 1; k--) {
{// 现在知道了要插入的位置是j+1这个位置,那么需要把j+1到i-1之间的数据统一后移一个位置,腾出j+1这个位置,
// 要插入我们要移动的那个key值,原来i的位置,被i-1这个位置的数字占据,依次类推,每个都向后移动一个位置,直到j+1被腾出来
}
System.out.println(k);
num[k] = num[k - 1];
}
num[j + 1] = key;// 把我们要插入的key值,插入到腾出来的j+1这个位置
}
}
return num;
}
上面的做法是找到要插入的位置,然后我们去移动这个位置后面的元素,再插入数据,我们可以直接在搜素的同时,就开始移动:
public static int[] sort2(int[] num) {
int len = num.length;
int i, j, key;
for (i = 1; i < num.length; i++) {// 同样认为第一个元素自成有序序列,把后面的元素加入这个序列,扩充他
key = num[i];// 记录当前要插入到前面有序序列里面的值,当前的位置是i
for (j = i - 1; j >= 0 && key < num[j]; j--) {// 把当前的值和前面的数值挨个比较,从i-1开始和i位置的这个key值比较,挨个往前,如果发现key值比前面一个位置的数值小,
// 就把前面一个数值往后面移动一位,继续把key值和前面的比较,直到发现key值当前所在位置前面的数值
// 比我们的key值小了,那就停止移动了.这个时候比方说我们发现X位置的值比它小,X后面的位置是我们要插入的位置,而此时X后面的那个数值是已经被移到X+1的位置了
num[j + 1] = num[j]; // 停止查找,跳出循环,在X+1位置插入key值,这
// 个就是移动一边查找合适的插入位置。
}
num[j + 1] = key;
}
return num;
}
次哦··变笨了··好难理解··