一、分类
二、时间复杂度
三、算法介绍及java实现(升序)
注意:通过举例子考虑边界
1、选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。
选择排序是不稳定的排序方法,举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了。
public void xuanze(int[] nums){ for(int i =0;i<nums.length-1;i++){ //最后一位默认有序 int min = i; for(int j=i;j<nums.length;j++){ if(nums[min]>nums[j]) min=j; } int temp = nums[min];//交换排序 nums[min] =nums[i]; nums[i]=temp; } }
2、冒泡排序
每次比较相邻的元素,交换数组,大的值在前面。 时间复杂度由于交换操作多比选择排序高。
稳定。
public void maopao(int[] nums){ for(int i =0;i<nums.length;i++){ for(int j = 0;i<nums.length-i-1;i--){ if(nums[j]>nums[j+1]){ int temp = nums[j]; nums[j]=nums[j+1]; nums[j+1] = temp; }}} }
3、插入排序
插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,算法适用于少量数据的排序,时间复杂度O(n^2)。
稳定
public void charu(int[] nums){ for(int i =1;i<nums.length;i++){ //找到在已排序中的位置 int pos=0; while(nums[pos]<nums[i]){ pos++; } int temp = nums[i]; for(int j= i;j>pos;j--){ nums[j]=nums[j-1]; } nums[pos] =temp; }}
4、希尔排序
1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。
gap为增量,每次缩小二分之一的gap,在内部使用插入排序。不稳定。
public void xier(int[] nums){ int gap = nums.length; while(gap>0){ gap/=2; for(int i =0;i<gap;i++){ for(int j =i+gap;j<nums.length;j+=gap){//插入排序 int temp = nums[j]; int k = j - gap; while (k >= 0 && nums[k] > temp) { nums[k + gap] = nums[k]; k -= gap; } nums[k + gap] = temp; } } if(gap==1) break; } }
5、归并排序
6、堆排序
7、快速排序
------------恢复内容结束------------
原文:https://www.cnblogs.com/huchengxi/p/12360783.html