排序算法
冒泡排序
冒泡排序其实就是通过遍历发现前后两个数的顺序不同而后交换实现如同冒泡一般的调序过程
要比较n(n-1)/2次——时间复杂度为O(n^2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| package it01.sort;
public class maopao { public static void main(String[] args) { int[] arr = {1,3,5,4}; bubbleSort(arr); } public static void bubbleSortWithDoubleFor(int[] arr){ boolean flag = false; for (int i = 0; i < arr.length-1; i++) { for (int j = 0; j < arr.length-1-i; j++) { if(arr[j]>arr[j+1]){ int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; flag = true; } } if (!flag){ break; }else { flag = false; } } for (int i : arr) { System.out.println(i); } }
public static void bubbleSort(int[] arr){ boolean flag = false; for (int i = 0; i < arr.length-1; i++) { if(arr[i]>arr[i+1]){ int temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; flag = true; } } if(flag){ bubbleSort(arr); }else { return; } for (int i : arr) { System.out.println(i); } } }
|
选择排序
选择排序就是先定义最开始(第一个)的数为最小值,然后从后面的数选择比他小的数然后与他交换,然后逐层遍历下去。
交换移动次数少,但是还是要比较n(n-1)/2次 时间复杂度是交换和比较次数的总和为**O(n^2)**但性能优于冒泡排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| package it01.sort;
public class selectsort { public static void main(String[] args) { int[] arr = {1, 3, 5, 4}; Selectsort(arr); for (int i : arr) { System.out.println(i); } } public static void Selectsort(int[] arr) { for (int i = 0; i < arr.length-1; i++) { int minindex = i; int min = arr[i]; for (int j = i+1; j < arr.length-1 ; j++) { if(min>arr[j]){ minindex = j; min = arr[j]; } } if(minindex!=i){ int temp = arr[i]; arr[i] = min; arr[minindex] = temp; } } } }
|
插入排序
插入排序类似于你打扑克时整理牌时对牌的排序
时间复杂度为O(n^2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| package it01.sort;
import java.util.Arrays;
public class InsertSort { public static void main(String[] args) { int[] arr = {101, 34, 119, 1,5,99,45648,456465,87461,15,0}; insertSortAll(arr); }
public static void insertSortAll(int[] arr) { for (int i = 1; i < arr.length; i++) { int insertIndex = i - 1; int insertValue = arr[i]; while (insertIndex >= 0 && insertValue < arr[insertIndex]) { arr[insertIndex + 1] = arr[insertIndex]; insertIndex--; } arr[insertIndex + 1] = insertValue; } System.out.println(Arrays.toString(arr)); } }
|
希尔排序
希尔排序是把记录按下标的一定增量分组,对每组进行比较直接插入排序算法排序。其中增量序列的最后一个增量必须等于1。该排序是不稳定的,时间复杂度为O(n^3/2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| package it01.sort;
import java.util.Arrays;
public class xier { public static void main(String[] args) { int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0}; YiWeiSort(arr); }
public static void xierSort(int[] arr) { for (int gap = arr.length / 2; gap > 0; gap /= 2) { int temp = 0; for (int i = gap; i < arr.length; i++) { for (int j = i - gap; j >= 0; j -= gap) { if (arr[j] > arr[j + gap]) { temp = arr[j]; arr[j] = arr[j + gap]; arr[j + gap] = temp; } } } } System.out.println(Arrays.toString(arr)); }
public static void YiWeiSort(int[] arr) { for (int gap = arr.length / 2; gap > 0; gap /= 2) { for (int i = gap; i < arr.length; i++) { int j = i; int temp = arr[j]; if (arr[j] < arr[j - gap]) { while (j - gap >= 0 && temp < arr[j - gap]) { arr[j] = arr[j - gap]; j -= gap; } arr[j] = temp; } } } System.out.println(Arrays.toString(arr)); } }
|
快速排序
快排基本思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的,可以说是冒泡排序的升级版(本质上是交换排序类)(过程可递归进行)
时间复杂度O (nlogn) 但是空间复杂度较高——比较常用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| package it01.sort;
import java.util.Arrays;
public class quickSort { public static void main(String[] args) { int[] arr = {-9,78,0,23,-567,70};
System.out.println("arr: "+ Arrays.toString(arr)); }
public static void quickSort(int[] arr, int left, int right){ int l = left; int r = right; int temp = 0; int pivot = arr[(left + right) / 2]; while (l<r){ while (arr[l]<pivot){ l++; } while (arr[r]>pivot){ r--; } if(l>=r){ break; } temp = arr[l]; arr[l] = arr[r]; arr[r] = temp; if(arr[l]==pivot){ r--; }else if(arr[r]==pivot){ l++; } } if(l==r){ l++; r--; } if (left < r) { quickSort(arr,left,r); } if (right > l) { quickSort(arr, l, right); } } }
|
基数排序(桶排序)
基数排序就是把数组的每个数按照个位十位百位那些位数排序到对应的桶里,一层层进行升序排序的过程。是典型的空间换时间的排序算法。
时间复杂度O(nlogn) 如果有负数就不使用基数排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| package it01.sort;
import java.util.Arrays;
public class radixsort { public static void main(String[] args) { int [] arr = {1,8,1,864,13,135}; radixSortAll(arr); System.out.println(Arrays.toString(arr)); }
static void radixSortAll(int[] arr){ int[][] bucket = new int[10][arr.length]; int[] bucketElementCounts = new int[10]; int index; int max = arr[0]; for (int i = 1; i < arr.length; i++){ if (max < arr[i]){ max = arr[i]; } } int maxLength = (max+"").length(); for (int i = 0,n = 1; i < maxLength; i++,n*=10) { for (int j = 0; j < arr.length; j++) { int digitOfElement = arr[j] / n % 10; bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j]; bucketElementCounts[digitOfElement]++; } index = 0; for (int k = 0;k < bucket.length; k++){ if (bucketElementCounts[k] != 0){ for (int j = 0; j < bucketElementCounts[k]; j++){ arr[index++] = bucket[k][j]; } } bucketElementCounts[k]= 0; } } } }
|
归并排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| package it01.sort;
import java.util.Arrays;
public class mergesort { public static void main(String[] args) { int[] arr = {8,4,5,7,1,3,6,2}; int[] temp = new int[arr.length]; mergeSort(arr, 0, arr.length-1, temp); System.out.println(Arrays.toString(arr));
} public static void mergeSort(int[] arr, int left, int right, int[] temp){ if (left < right) { int mid = (left + right) / 2; mergeSort(arr, left, mid, temp); mergeSort(arr, mid+1, right, temp);
merge(arr, left, mid, right,temp); } }
public static void merge(int[] arr,int left, int mid, int right, int[] temp) { int i = left; int j = mid + 1; int t = 0; while (i <= mid && j <= right){ if (arr[i] <= arr[j]){ temp[t++] = arr[i++]; }else { temp[t++] = arr[j++]; } } while (i <= mid){ temp[t++] = arr[i++]; } while (j <=right){ temp[t++] = arr[j++]; } t = 0; int tempLeft = left; while (tempLeft <= right){ arr[tempLeft++] = temp[t++]; } } }
|