大晚上睡不着呢,下了本算法导论,电子版的,书的太贵了==,承受不起啊。。
第一个算法是插入排序,不管会不会吧,都再重新复习一下
注:以下所有算法都将是自己手打,绝不看书,也算是对自己的一个要求吧。
1.插入排序
private static void insertsort(int[] a){
int j=0;
int key;
for (int i =1; i < a.length; i++) {
j=i;
key=a[i];
if(a[j-1]>key){
while(j>=1&&a[j-1]>key){
a[j]=a[j-1];
j--;
}
a[j]=key;
}
}
}
就先写这么点吧。。毕竟时间有限了。这个算法形象一点就描述就像我们玩牌的时间把牌把从小到大插起来一样,有时间再补、
2.快速排序
void QuickSort(T a[],int p,int r){
if (p<r){
int q=partion(a,p,r);
QuickSort(a,p,q-1);
QuickSort(a,q+1,r);
}
}
int partion(T a[],int p,int r){
T x = a[r];
int middle = p;
for (int j = p ; j < r ; j++){
if (a[j] < x){
T temp = a[middle];
a[middle] = a[j];
a[j] = temp;
middle++;
}
}
T temp = a[r];
a[r] = a[middle];
a[middle] = temp;
return middle;
}
quicksort方法是将数组下标p到r的范围之间的数字进行排序,这里我用的是泛型因为可以通用嘛,都先要判断p与r之前的大小 关系 ,这就是常说的容错处理,然后能用调用partion这个方法找到q。
partion这个方法的作用是先找到最后一个数作为中间比较数的值。然后从下标q开始遍历,直到找到那个比刚才比较数小的值,然后作交换。最后将比较的数与middle作交换。 返回的是middle 也就是那个下标然后再调用本身,这是一个间接递归的过程,用的算法思想是分治的思想,将这个下标从p到r的数组分成了两部分分别进行排序,然后再继续分。这样最后的结果就是将整个一个数组分成了几个小部分。
第一次遍历将所有比最后一个数小的数全都放到它的前面。所有比它大的数就在它的后面了。返回的数是分成两个部分的中间的结果数组,然后如此反复就完成了整个数组的排序