关于冒泡、快排、二分排序算法分析

前面的话:

把自己总结的排序方法分享一下,也当作自己的笔记本了
冒泡: 冒泡排序算法的主要思想是每次只比较相邻的两个元素,一轮排序之后,最大的元素就会沉到最下面(全文默认升序),然后每次循环比较,就可以得到一个已排序好的数组。

代码实现:
public static void main(String[] args) {
	int[] num = {8,20,1,3,9,5,41,10,11,2};
	//冒泡排序
	for (int i = 0; i < num.length-1; i++) {  //控制比较轮次
		for (int j = 0; j < num.length-i-1; j++) {  //控制每轮中各个元素的比较次数
			if (num[j]>num[j+1]) {   //升序
				int temp = num[j+1];
				num[j+1] = num[j];
				num[j] = temp;
			}
		}
	}
	Out(num);
	
}


//输出数组中元素
public static void Out(int[] arrs) {
	for (int i = 0; i < arrs.length; i++) {
		System.out.println(arrs[i]);
	}
}

经过这样的排序之后,数组就有序了!其中内循环为什么要写 num.length-i-1 呢? 因为经过一轮循环之后,最大的元素就会沉到最下面,所以在后面比较的时候就不需要再参与比较了。num[j]>num[j+1] 这个是只比较两个相邻的元素。
快速排序: 快速排序算是冒泡排序的改进算法,有很多方法可以实现,我这里用了最经典的 挖坑法 来解决问题,直接上代码。

代码实现:
static void sort(int[] a,int low,int high){
	
    int start = low;
    int end = high;
    int key = a[low];
    
    while(end>start){
        //从后往前比较
        while(end>start&&a[end]>=key)  //如果没有比关键值小的,比较下一个,直到有比关键值小的交换位置,然后又从前往后比较
            end--;
        if(a[end]<=key){
            int temp = a[end];
            a[end] = a[start];
            a[start] = temp;
        }
        //从前往后比较
        while(end>start&&a[start]<=key)//如果没有比关键值大的,比较下一个,直到有比关键值大的交换位置
           start++;
        if(a[start]>=key){
            int temp = a[start];
            a[start] = a[end];
            a[end] = temp;
        }
    //此时第一次循环比较结束,关键值的位置已经确定了。左边的值都比关键值小,右边的值都比关键值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用
    }
    //递归比较后面的数据
    //现在数组右边的都是比第一轮哨兵小的数据
    //数组左边的数据都是比第一轮哨兵大的数据
    //两边数据中不是有序的,所以后面要递归排序
    if(start>low) sort(a,low,start-1);//左边序列。第一个索引位置到关键值索引-1
    if(end

可能大家看的云里雾里的,下面附上小编准备的一张手写步骤纸:
关于冒泡、快排、二分排序算法分析_第1张图片
自己亲手将快排的第一轮的排序过程写了出来,还算清晰,其中,在每轮排序的时候都会设置一个哨兵(key) 来和后面的数据进行比较,比较的顺序是 左右交替 进行比较。

你可能感兴趣的:(算法,冒泡排序,快速排序,排序)