java中几种常见的排序

1.冒泡排序

依次比较相邻的2个数,大的就往后排,第一轮下面就将最大的数放到了最后,
第2次就得到第2大的数,由于最后一个数不需要排序,那么只需要拍数组长度减1就全部排序完.

public class BubbleSort {
	public static void BubbleSort(int[] arr) {
    int temp;//定义一个临时变量
    for(int i=0;i<arr.length-1;i++){//冒泡趟数
        for(int j=0;j<arr.length-i-1;j++){
            if(arr[j+1]<arr[j]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}
		return arr;
	}
	
	public static void main(String[] args) {
		int[] arr = new int[]{1,42,34,12,5};
		arr = bubbleSort(arr);
		for (int i : arr) {
			System.out.println(":"+i);
		}
	}
	
}

2.选择排序

a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕。也就是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。基于此思想的算法主要有简单选择排序、树型选择排序和堆排序。(这里只介绍常用的简单选择排序)

b) 简单选择排序的基本思想:给定数组:int[] arr={里面n个数据};第1趟排序,在待排序数据arr[1]arr[n]中选出最小的数据,将它与arrr[1]交换;第2趟,在待排序数据arr[2]arr[n]中选出最小的数据,将它与r[2]交换;以此类推,第i趟在待排序数据arr[i]~arr[n]中选出最小的数据,将它与r[i]交换,直到全部排序完成。

举例:数组 int[] arr={5,2,8,4,9,1};


第一趟排序: 原始数据:5 2 8 4 9 1

最小数据1,把1放在首位,也就是1和5互换位置,

排序结果:1 2 8 4 9 5


第二趟排序:

第1以外的数据{2 8 4 9 5}进行比较,2最小,

排序结果:1 2 8 4 9 5


第三趟排序:

除1、2以外的数据{8 4 9 5}进行比较,4最小,8和4交换

排序结果:1 2 4 8 9 5


第四趟排序:

除第1、2、4以外的其他数据{8 9 5}进行比较,5最小,8和5交换

排序结果:1 2 4 5 9 8


第五趟排序:

除第1、2、4、5以外的其他数据{9 8}进行比较,8最小,8和9交换

排序结果:1 2 4 5 8 9

代码:

public class SelectSort {
	
	private static int[] selectSort(int[] arr){
		for(int i=0;i<arr.length;i++){
			int k = i; //记录找出那个最小的数下标,0表示经过第一轮找出最小的放在arr[0],依此类推
			for(int j=k+1;j<arr.length;j++){
				if(arr[k]>arr[j]){
					k = j; //依次和后面的数进行比较找出小的记住下标
				}
				//将找到的数放入指定位置
				int t = arr[i];
				arr[i] = arr[k];
				arr[k] = t;
				
			}
		}
		return arr;
	}

	public static void main(String[] args) {
		int[] arr = new int[]{1,42,34,12,5};
		int[] sort = selectSort(arr);
		for (int i : sort) {
			System.out.println(":"+i);
		}
	}
	
}

3.快速排序

原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

举个例子

如无序数组[6 2 4 1 5 9]

a),先把第一项[6]取出来,

用[6]依次与其余项进行比较,

如果比[6]小就放[6]前边,2 4 1 5都比[6]小,所以全部放到[6]前边

如果比[6]大就放[6]后边,9比[6]大,放到[6]后边,//6出列后大喝一声,比我小的站前边,比我大的站后边.

一趟排完后变成下边这样:

排序前 6 2 4 1 5 9

排序后 2 4 1 5 6 9

b),对前半拉[2 4 1 5]继续进行快速排序

重复步骤a)后变成下边这样:

排序前 2 4 1 5

排序后 1 2 4 5

前半拉排序完成,总的排序也完成:

排序前:[6 2 4 1 5 9]

排序后:[1 2 4 5 6 9]

排序结束

public static void quickSort(int[] numbers, int start, int end) {   
    if (start < end) {   
        int base = numbers[start]; // 选定的基准值(第一个数值作为基准值)   
        int temp; // 记录临时中间值   
        int i = start, j = end;   
        do {   
            while ((numbers[i] < base) && (i < end))   
                i++;   
            while ((numbers[j] > base) && (j > start))   
                j--;   
            if (i <= j) {   
                temp = numbers[i];   
                numbers[i] = numbers[j];   
                numbers[j] = temp;   
                i++;   
                j--;   
            }   
        } while (i <= j);   
        if (start < j)   
            quickSort(numbers, start, j);   
        if (end > i)   
            quickSort(numbers, i, end);   
    }   
}  

4.插入排序

从数组的第二个元素开始,将数组中的每一个元素按照(升序或者降序)规则插入到已排好序的数组中以达到排序的目的.
一般情况下将数组的第一个元素作为起始元素,从第二个元素开始依次插入。由于要插入到的数组是已经排好序的,所以只要从右向左(或者从后向前)找到排序插入点插入元素,以此类推,直到将最后一个数组元素插入到数组中,整个排序过程完成。

每次将数组最后一个元素作为插入元素,与它前面有序(已排好序)的数组元素进行比较后,插入正确的位置,排序完成。(如下图)

在这里插入图片描述
代码:

/**
     * 插入排序:  
     * 原理:每次将数组最后一个元素作为插入元素,与它前面有序(已排好序)的数组元素进行比较后,插入正确的位置,排序完成。
     * 升序为例
     */
    private static int[]  insertionSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {// i: 代表即将插入的元素角标,作为每一组比较数据的最后一个元素    
            for (int j = i; j > 0; j--) {   //j:代表数组角标
                if (arr[j] < arr[j - 1]) {//符合条件,插入元素(交换位置)
                    int temp = arr[j];
                    arr[j] = arr[j - 1];
                    arr[j - 1] = temp;
                }
            }
        }
        return arr;
    }

猜你喜欢

转载自blog.csdn.net/qq_36331657/article/details/87730461