Java数组排序

冒泡排序

//冒泡排序:每次循环将相邻两个数中数值大的往后移动一位
//由于外循环是依据数组长度定义循环次数,总循环次数保证了即使剩两个数也会循环一次来做比较
//内循环每次循环保证排好序的位置不去比较,没排好位的即使满足条件也要循环比较
//我们要在满足条件时中断这种不必要的操作,就需要判断没有排好序的位置上数值是否满足条件
//内循环遍历的都是没有排好序的,内循环完成一次完整的循环而没有调换数值位置,
//说明没有排好序的数值全都满足条件,这时候的循环排序已经没有意义,就可以中断循环
//也可以反过来排序,将较小的往后移
int[] arr = {12,5,54,46,532,2,13,45,12,11};
int num = 0;
boolean bo;
for (int i = 0; i < arr.length-1 ; i++) {
	bo = true;
	for (int j = 0; j < arr.length-1-i; j++) {
		if(arr[j]>arr[j+1]) {
			num = arr[j];
			arr[j]=arr[j+1];
			arr[j+1]=num;
			bo=false;
		}
	}
	if(bo) {
		System.out.println("i="+i);
		break;
	}
}

选择排序

//选择排序:选择排序算法的基本思路是为每一个位置选择当前最小的元素
//首先将第一个位置与其他位置依次比较,将最小的放在第一位,
//也可以反过来排序,将较大的放在前边
//方法一:每次找较小值交换到前边
int[] arr = {12,5,54,46,532,2,13,45,12,11};
for(int i = 0 ; i < arr.length-1 ; i++){
    for(int j = i+1 ; j < arr.length ; j++){
        if(arr[i] > arr[j]){
            int num = arr[i];
            arr[i] = arr[j];
            arr[j] = num;
        }
    }
}
//方法二:一次性找到最小值的下标,完成内循环后将第一位与最小值交换
for (int i = 0; i < arr.length-1; i++) {
	int index = i;
	for (int j = i+1; j < arr.length; j++) {
		if(arr[index]>arr[j]) {
			index=j;
		}
	}
	if(index!=i) {
		int num = arr[index];
		arr[index]=arr[i];
		arr[i]=num;
	}
}

快速排序

//快速排序:根据一个定量将比该值大的放在右边,比该值小的放在左边,分成左右两部分,通过递归依次分组实现排序
//1.将数组第一个元素作为标记值,左右两边通过下标获取值进行比较
//2.左边值小于标记值,则将左边下标后移继续比较,直到相同或大于比较值,下标不动,以待将该值移动到右侧
//3.右边值大于标记值,则将右边下标前移继续比较,直到相同或小于比较值,下标不动,以待将该值移动到左侧
//4.完成上述步骤后,需要移动两边数据,(先判断一下两个数据是否相同,相同则不移动,同时移动一个下标)
//5.当两边下标移动到一块时,说明数组已经完成了分组,分组边界为两下标所在处
//6.然后分别让两组数据通过递归方式继续进行上述步骤,直到分组后数组元素唯一(即递归出口)
public static void main(String[] args){
    int[] arr = {1,2,12,3,132,1,52,5,4,65,4,685,321};
    qsort(arr,0,arr.length-1);
}
public static void qsort(int arr[],int start,int end) {        
    int number = arr[start];
    int i = start;
    int j = end;
    while(i<j) {
    	while(i<j&&arr[j]>number) {
    		j--;
    	}
    	while(i<j&&arr[i]<number) {
    		i++;
    	}
    	if(arr[i]==arr[j]&&i<j) {
    		i++;
    	}
    	else {
    		int num = arr[j];
    		arr[j] = arr[i];
    		arr[i] = num;
    	}
    }
    if(i-1>start) {
    	qsort(arr,start,i-1);
    }
    if(j+1<end) {
    	qsort(arr,j+1,end);
    }
}  

插入排序

//插入排序:数组左侧为排好序的数值,右侧依次遍历时候,将数值放进左侧数组中合适的位置
//1.将需要排序的数值与下标拿出来,然后用这个数值与前边排好序的数依次比较
//2.如果前边的数大,将前边的数向后移动一位,并将空出来的下标预留给新数值,直到前边的数不大于新数值
//3.将新数值放到空出来的位置上,然后继续往后拿下一个新数值
for (int i = 1; i < arr.length; i++) {
	int number = arr[i];
	int index = i;
	for (int j = i-1; j >=0; j--) {
		if(number<arr[j]) {
			arr[j+1]=arr[j];
			index = j;
		}
	}
	arr[index]=number;
}
posted @ 2021-01-25 20:27  鱼归大海  阅读(255)  评论(0)    收藏  举报