简单排序:插入排序、冒泡排序、选择排序

插入排序

1.基本思想

每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。

2.图解

图片来源:https://www.cnblogs.com/chengxiao/p/6103002.html

3.代码实现


public class InsertionSorting {
	
	public static void main(String[] args) {
		
		int arr[] = {10,8,15,7,6,12,3,4,17,19,9};
		
		for(int i = 1; i < arr.length; i++){//把10看做排序好的记录,把右边的数插入
			int j = i;
			while(j > 0 && arr[j] < arr[j-1]){
				swap(arr,j,j-1);
				j--;
			}
		}
		//遍历输出排序好的数组元素
		for(int i : arr){
			System.out.print(i+" ");
		}
	}

	private static void swap(int[] arr, int j, int i) {
		int temp = arr[j];
		arr[j] = arr[j-1];
		arr[j-1] = temp;
	}
}

4.总结

       简单插入排序在最好情况下,需要比较n-1次,无需交换元素,时间复杂度为O(n);在最坏情况下,时间复杂度依然为O(n*n)。但是在数组元素随机排列的情况下,插入排序要优于冒泡排序和选择排序。所以,虽然三个排序(冒泡、选择、插入)的时间复杂度都是O(n*n),但是插入排序是效率最高的。

冒泡排序

1.原理

        对相邻的元素进行两两比较,如果顺序相反则进行交换,这样,每一轮排序会有一个最大或最小的元素浮到顶端,最终达到完全有序。

2.图解

3.代码实现

/**
 * @author Daniel
 *	冒泡排序进行数组元素排序
 *	每次比较相邻的两个元素,经过每一轮排序,就会有一个大的数排在最后(每次都比较出最大的一个数)
 */
public class BubbleSortDemo {
    public static void main(String[] args) {
        int[] arr = {5,4,3,2,1};//静态初始化一个数组
        //冒泡排序
        for(int i = 0; i < arr.length-1; i ++) {//length个数需要length-1轮比较
            for(int j = 0; j < arr.length - 1 - i; j ++) {//每次进行length-1-i次比较
                if(arr[j] > arr[j + 1]) {//如果当前元素大于后面一个元素则进行交换
                    InsertionSorting.swap(arr,j,j+1);
                }
            }
        }
        for (int i : arr) {//遍历排序后的数组
            System.out.print(i + " ");
        }
    }
}

4.总结

        冒泡排序中,n个元素要进行n-1轮排序,第i次排序要比较n-i次。时间复杂度为O(n*n)

选择排序

1.原理

        每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序。

2.代码实现

public class SelectionSort {

	public static void main(String[] args) {

		int arr[] = {5,9,12,3,15,8};
		
		for(int i = 0;i < arr.length - 1; i++){
			int minindex = i;//每一轮比较假设第一个元素最小
			for(int j = i+1; j < arr.length; j++){
				if(arr[j] < arr[minindex]){//每一轮从左往右与第一个元素比较
					minindex = j;
				}
			}
			//判断当前最小元素的下标是否改变,若改变,交换值
			if(minindex != i){
				InsertionSorting.swap(arr, i, minindex);
			}
		}
		//遍历输出排序后的数组元素
		for(int i : arr){
			System.out.print(i+" ");
		}
	}

}

3.总结

        选择排序和冒泡排序一样,n个元素需要n-1轮排序,在最好情况下也就是数组完全有序的时候,无需任何交换移动,在最差情况下,也就是数组倒序的时候,交换次数为n-1次。综合下来,时间复杂度为O(n2)。


参考资料:https://www.cnblogs.com/chengxiao/p/6103002.html

                  https://blog.csdn.net/ComTNT/article/details/53075156

                  https://www.cnblogs.com/bjh1117/p/8335628.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值