十大经典排序算法

排序算法有很多,包括插入排序冒泡排序堆排序归并排序,选择排序,计数排序基数排序桶排序快速排序等。插入排序,堆排序,选择排序,归并排序和快速排序,冒泡排序都是比较排序,它们通过对数组中的元素进行比较来实现排序,其他排序算法则是利用非比较的其他方法来获得有关输入数组的排序信息。

各种排序算法总结:

相关概念:

稳定:如果a原本在b的前面,a=b,排序之后a还是在b的前面。

不稳定:a在b的前面,a=b,排序之后b跑到了a的后面

时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。

空间复杂度:算法在计算机内执行时所需要的存储空间的度量,也是数据规模n的函数。

1.冒泡排序

是简单的一种排序方法,重复的访问要排序的数列,一次比较两个元素。

算法描述:

  1. 比较相邻的两个元素,若前面的比后面的大,就让他们互换位置
  2. 对每一对相邻的元素,做1中的操作,从第一对到最后一对,这样最后的一个数一定是所排序数列中最大的数。
  3. 针对所有元素,重复以上步骤
  4. 重复1~3,直到排序完成。

代码实现:

public static int[] bubbleSort(int[] arr){
		int temp;
		for(int i = 0 ; i<arr.length;i++){
			for(int j=1;j<arr.length-i;j++){
				if (arr[j-1]>arr[j]) {
					temp = arr[j-1];
					arr[j-1] = arr[j];
					arr[j] = temp;
				}
			}
		}
		return arr;
	}

 2.选择排序

原理:在未排序的数组中找出最小(大)的元素,置于序列的起始位置,然后在从剩下的没有排序的数中找出最小(大)的,放在已排序的数后面。以此类推,直至排序完毕。

变现最稳定的排序算法之一。因为无论什么数据进去都是O(n2)的时间复杂度,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。

算法描述:

n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果

  • 初始状态:无序区为R[1...N],有序区为空
  • 第i趟排序(i=1,2,3,4,...n-1)开始时,当前有序区和 无序区分别为R[1,..,n-1]和R[i,...n].该趟排序从无序区中选出关键字最小的记录R[k],让他与无序区的第一个数进行交换使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
  • n-1趟之后,数组就有序了。

代码实现

    public static int[] selectsort(int[] arr){
        if (arr.length==0) {
            return null;
        }
        for(int i = 0;i<arr.length;i++){
            int min = i;
            for(int j=i;j<arr.length;j++){
                if (arr[j]<arr[min]) {//找到最小数
                    min = j;//把最小数的索引进行 保存
                }
            }
            int temp = arr[min];
            arr[min] = arr[i];
            arr[i] = temp;
        }
        return arr;
    }

 3.插入排序

原文地址:https://www.cnblogs.com/znn93/p/9112300.html