选择排序:把第一个元素和其他元素依次对比,第一次比较完后 ,和最小的交换位置,即第一次最小的值出现在前面。然后第二个数和后面的进行比较 以此类推。(具体可参考https://www.cnblogs.com/nullering/p/9537321.html)
//简单选择排序,按自然顺序 public static void selectsort(int[] array){ int min, index, temp;//定义最小值索引 。 for(int i = 0; i < array.length - 1; i++){ // N - 1 趟 min = i; //查找选择最小元素值的下标索引值 for(index = i + 1; index < array.length; index++){ if(array[min] > array[index]) min = index; } //交换位置 if(min != i){ temp = array[min]; array[min] = array[i]; array[i] = temp; } } }
冒泡排序:相邻元素两两比较,大的往后放,第一次比较完后,最大值出现在末尾即最大索引处。时间复杂度O(n²)
1 public static int maopao(int[ ] arr){ 2 3 for(int i=0;i<arr.length-1;i++){ 4 5 for(int j=0;j<arr.length-1-i;j++){ 6 7 if(a[j]>a[j+1]){ 8 9 int temp=arr[j]; 10 11 arr[j]=arr[j+1]; 12 13 arr[j+1]=temp;} 14 15 } 16 17 return temp; 18 19 } 20 }
插入排序:第一个数据不动,从第二个开始和它前面的进行比较,比它大的向后排,比它小则不动。
1,
2,
3,
1 import java.util.Arrays; 2 3 //插入排序 4 //第一个数据不动,从第二个开始和它前面的进行比较,比它大的向后排,比它小则不动 5 public class Insert { 6 public static void sort(int[] arr) { 7 8 int insertData;// 要插入的数据 9 // 从数组的第二个元素开始循环将数组中的元素插入 10 for (int i = 1; i < arr.length; i++) { 11 insertData = arr[i]; 12 /*for(int j=i-1;j>=0;j--){ 13 if(a[i]<a[j]){ 14 arr[j + 1] = arr[j]; 15 }else{ 16 break; 17 } 18 }*/ 19 int j = i - 1; 20 // 如果要插入的元素小于第j个元素,就将第j个元素向后移 21 while ((j >= 0) && insertData < arr[j]) { 22 arr[j + 1] = arr[j]; 23 j--; 24 } 25 // 直到要插入的元素不小于第j个元素,将insertNote插入到数组中 26 arr[j + 1] = insertData; 27 //System.out.println(Arrays.toString(arr)); 28 } 29 System.out.println(Arrays.toString(arr)); 30 } 31 32 public static void main(String[] args) { 33 int arr[]={2,6,5,4,7,8}; 34 //int arr[]=null; 35 //int arr[]={2,1}; 36 //int arr[]={2};//[2] 37 sort(arr); 38 39 } 40 41 }
归并排序:
1 package zh.ysj; 2 3 class guibingpaixu { 4 5 public static int[] sort(int[] a,int low,int high){ 6 int mid = (low+high)/2; 7 if(low<high){ 8 sort(a,low,mid); 9 sort(a,mid+1,high); 10 //左右归并 11 paixu(a,low,mid,high); 12 } 13 return a; 14 } 15 16 public static void paixu(int[] a, int low, int mid, int high) { 17 int i= low; 18 int j = mid+1; 19 int k=0; 20 int[] temp = new int[high-low+1]; 21 // 把较小的数先移到新数组中 22 while(i<=mid && j<=high){ 23 if(a[i]<a[j]){ 24 temp[k++] = a[i++]; 25 }else{ 26 temp[k++] = a[j++]; 27 } 28 } 29 // 把左边剩余的数移入数组 30 while(i<=mid){ 31 temp[k++] = a[i++]; 32 } 33 // 把右边边剩余的数移入数组 34 while(j<=high){ 35 temp[k++] = a[j++]; 36 } 37 // 把新数组中的数覆盖数组 38 for(int x=0;x<temp.length;x++){ 39 a[x+low] = temp[x]; 40 } 41 } 42 43 44 45 46 public static void main(String[] args) { 47 // TODO Auto-generated method stub 48 int[]a ={2,5,8,7,4,5,3}; 49 sort(a,0,a.length); 50 51 52 } 53 }
快速排序
import java.util.Arrays;
/*
* 快速排序:
* 一趟快速排序的算法是:
* 1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
* 2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];
* 3)从j开始向前搜索,即由后开始向前搜索(j=j-1即j--),
* 找到第一个小于key的值A[j],A[i]与A[j]交换;
* 4)从i开始向后搜索,即由前开始向后搜索(i=i+1即i++),
* 找到第一个大于key的A[i],A[i]与A[j]交换;
* 5)重复第3、4、5步,直到 I=J;
* (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。
* 找到并交换的时候i, j指针位置不变。
* 另外当i=j这过程一定正好是i+或j-完成的最后令循环结束。)
*/
1 public class speedSort { 2 public static void sort(int[] data) { 3 quickSort(data, 0, data.length - 1); 4 } 5 6 private static void quickSort(int[] data, int i, int j) { 7 int pivotIndex = (i + j) / 2; 8 // swap 9 swap(data, pivotIndex, j);//交换位置 10 11 int k = partition(data, i - 1, j, data[j]); 12 swap(data, k, j);//交换位置 13 if ((k - i) > 1) 14 quickSort(data, i, k - 1);//交换位置 15 if ((j - k) > 1) 16 quickSort(data, k + 1, j);//交换位置 17 18 } 19 20 /** 21 * @param data 22 * @param i 23 * @param j 24 * @return 25 */ 26 private static int partition(int[] data, int l, int r, int pivot) { 27 do { 28 while (data[++l] < pivot) 29 ; 30 while ((r != 0) && data[--r] > pivot) 31 ; 32 swap(data, l, r);//交换位置 33 } while (l < r); 34 swap(data, l, r);//交换位置 35 return l; 36 } 37 public static void main(String[] args) { 38 int[] arr = { 2, 5, 3, 1, 4 }; 39 System.out.println("排序前:" + Arrays.toString(arr)); 40 // InsertSort.sort(arr); 41 // BubbleSort.sort(arr); 42 // SelectionSort.sort(arr); 43 // ShellSort.sort(arr); 44 sort(arr); 45 // MergeSort.sort(arr); 46 // HeapSort.sort(arr); 47 System.out.println("排序后:" + Arrays.toString(arr)); 48 } 49 50 /* 51 * 交换数组中的两个元素 52 */ 53 public static void swap(int[] data, int i, int j) { 54 int temp = data[i]; 55 data[i] = data[j]; 56 data[j] = temp; 57 } 58 59 60 }