排序算法的总结

来源:互联网 发布:科目二模拟软件 编辑:程序博客网 时间:2024/05/18 15:07

1>冒泡排序
原理:拿相邻的数比较,如果a[i]>a[i+1] ,两者互换,那么第一轮就会把最大的数拍到最后一个。
(规模响应减小,且每一轮都可以得到正确结果)
优化:设立一个flag,把他放在每一轮最后不在交换的位置,那么在flag之后的数都是有序的。

2>插入排序
原理:那一个数和他前面的数比较,如果它小于它前面的数,就把它前面的数放到它的位置上,那就空出一个位置,最终可以找到合适的位置,放入取出的数。
第一个数从数组第二个开始取,保证取得数的前面都是有序的。
本质:通过移动,把数插入到有序数列中。 (缺点:很多数会重复移动)

3>选择排序
实质上,前面的冒泡排序就是一种简单的选择排序,选择最大的放入到指定位置,但是他是通过不断交换得到的,而选择排序是通过比较得到最大的数,直接赋值得到,稍微比冒泡优化。
1.一般的选择排序原理:
取最后一个数的下标存入到max域中,把最后一个数依次和前面的数比较,发现比它大的数,那么就把比较大的数的下标存入max域中,当一轮遍历完成,就把max域代表的数和选择的数进行互换。
2.优化的选择排序原理:
我们可以看到,一般选择排序是采用选择最大或者最小来作为标准。其实比较的同时,能找到最大的数,肯定也能找到最小的数。
第一轮, 取第一个数的下标存入min域,最后一个数的下标存入max域中,然后和上面一样,得到最大最小就好了。循环终止条件是,while(i小于j)

   **这里要注意一点,因为同时要得到max和min,因此选择的两个数a[min] 和 a[max]  也要参与比较,(选出最大时,a[min]要参加比较; 选出最小时,a[max]要参加比较)**

4>二分归并排序mergeSort(效率最高的)

public static  void mergeSort(int[] a,int first,int last,int[] temp){        if(first<last){            int mid=(first+last)/2;            mergeSort(a, first, mid, temp);            mergeSort(a,mid+1,last,temp);            mergeArray(a,first,mid,last,temp);        }    }    private static void mergeArray(int[] a, int first, int mid, int last, int[] temp) {        // TODO Auto-generated method stub        int i=first,j=mid+1;        int m=mid,n=last;        int k=0;        while(i<=m && j<=n){            if(a[i]<=a[j])                temp[k++]=a[i++];            else                temp[k++]=a[j++];        }        while(i<=m)            temp[k++]=a[i++];        while(j<=n)            temp[k++]=a[j++];        for(i=0;i<k;i++){            a[first+i]=temp[i];        }    }
0 0
原创粉丝点击