简单排序
写算法提的时候 一定要图形结合,知道是怎么个原理,不能一味的看代码
另外不要求一步写到位,边界值的问题可以慢慢调试
选择排序
选择排序是最简单但是也是最没用的算法 时间复杂度O(n^2)而且不稳定
思路:每次都从剩下的数组找到最小的值放到前面来
public static void sort2(int[] arr) { for(int i=0; i<arr.length - 1; i++) { int minIndex=i; for(int j=i+1;j<arr.length;j++){ if (arr[minIndex]>arr[j]){ swap(arr, j, minIndex); } } } }
这样每次都要做交换,可以记住位置 只交换一次
static void sort(int[] arr){ for(int i=0;i<arr.length-1;i++){ int minPos=i; // 随着i的变化而变化 for(int j=i+1;j<arr.length;j++){ if (arr[j]<arr[minPos]){//这个时候 minPos要更新 minPos=j; } } swap(arr,i,minPos); } }
冒泡排序简介
原理:比较两个相邻的元素,将值大的元素交换至右端。
思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。
第一趟比较完成后,最后一个数一定是数组中最大的一个数,
static void sort3(int[] arr) { for(int i=arr.length-1;i>0;i--){ for (int j=0;j<i;j++){ if (arr[j]>arr[j+1]){ swap(arr,j+1,j); } } } }
插入排序
基本思想:插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于基本有序数组的排序,时间复杂度为O(n^2)。
static void sort2(int[] arr) { for(int i=1; i<arr.length; i++) { //0-i有序 for(int j=i; j>0; j--) { if(arr[j] < arr[j-1]) { swap(arr, j, j-1); }else{ break; } } } }
总结:
冒泡排序:基本不用,太慢
选择排序:基本不用,不稳
插入排序:样本小 且基本有序的时候效率比较高
三大排序比较
希尔排序
希尔排序是插入排序的改进,每次取一个间隔进行插入排序,然后不断缩小间隔
间隔大的时候 移动的次数少
间隔小的时候 移动的距离短
因为希尔排序是跳着排 所以不稳定 比如 9 6 11 3 3 (红色的3还会跑到蓝色的3前面)
static void sort(int[] arr){ for (int gap=4;gap>0;gap/=2){ /**希尔排序的间隔**/ for (int i=gap;i<arr.length;i+=gap){ insertN(arr,i,gap); } } } /**把前i个排成有序*/ static void insertN(int[] arr, int i,int gap){ for(int j=i;j>gap-1;j=j-gap){ if (arr[j]<arr[j-gap]){ swap(arr,j,j-gap); } } }