public class TestSort { public static void selectSort(int[] arr) { for(int i = 0;i<arr.length;i++) { int temp = arr[i]; int flag = i; for(int j = i+1;j<arr.length;j++) { if(arr[j] < temp) { temp = arr[j]; flag = j; } } if(flag != i) { arr[flag] = arr[i]; arr[i] = temp; } } } public static void insertSort(int[] arr) { if( arr!= null) { for(int i = 1;i<arr.length;i++) { int temp = arr[i]; int j = i; if(arr[j-1]>temp) { while(j>=1&&arr[j-1]>temp) { //选择的那个数比前面的数要小, //则就将其跟前面的数一个一个比较,知道碰到比这个数还要小的,将其放在这 arr[j] = arr[j-1]; j--; } } arr[j] = temp; } } } public static void bubbleSort(int[] arr) { for(int i = 0;i<arr.length - 1;i++) { for(int j = arr.length - 1;j>i;j--) { if(arr[j] < arr[j-1]) { int temp = arr[j]; arr[j] = arr[j-1]; arr[j-1] = temp; } } } } public static void merge(int[] a,int s,int m,int t) { int i,j,k; int n1 = m - s + 1; int n2 = t - m; int[] left = new int[n1]; int[] right = new int[n2]; for(i = 0,k = s;i<n1;i++,k++) { left[i] = a[k]; } for(i = 0,k = m + 1;i<n2;i++,k++) { right[i] = a[k]; } for(i = 0,j = 0,k = s;i < n1 && j < n2;) { a[k++] = (left[i]<right[j])?left[i++]:right[j++]; } while(i<n1) { a[k++] = left[i++]; } while(j<n2) { a[k++] = right[j++]; } } public static void mergeSort(int[] a,int s,int t) { if(s<t) { int q = (s + t)/2; mergeSort(a, s, q); mergeSort(a, q+1, t); merge(a, s, q, t); } } //快速排序 public static void quickSort(int[] a,int low,int high) { if(low >= high) { return; } int i = low,j = high; int pivot = a[i]; //每次取第一个元素作为分割值 while(i < j) { while(i < j&&a[j] > pivot) { j--; } if(i<j) { a[i++] = a[j]; } while(i<j&&a[i]<pivot) { i++; } if(i<j) { a[j--] = a[i]; } } a[i] = pivot; quickSort(a, low, i - 1); quickSort(a, i + 1, high); } //希尔排序 public static void shellSort(int[] a) { int len = a.length; int h; //h为跨度 int i,j; int temp; for(h = len/2;h>0;h /= 2) { for(i = h;i<len;i++) { temp = a[i]; j = i - h; //同一组中上一个元素的下标 while(j>0 && temp < a[j]) { //当前数值小于同一组中的上一个元素 a[j + h] = a[j]; j = j - h; } a[j + h] = temp; //j+h,因为上面减的小于0了 = = } } } //堆排序 public static void adjustMinHeap(int[] a,int pos,int len) { //将pos位置处的结点调整为小顶堆 int child; int temp; for(temp = a[pos];2*pos+1<=len;pos = child) { //迭代该节点下的所有子节点 child = 2*pos+1; if(child<len&&a[child]>a[child+1]) { child++; } if(a[child]<temp) { //如果某一个结点的子节点小与该节点的值,则替换之 a[pos] = a[child]; }else break; //此时已经到头了 } a[pos] = temp; //此时的pos为child的值,这样做就把该节点和小与该节点的子节点交换的值 } public static void heapSort(int[] a) { int len = a.length; for(int i = len/2 - 1;i >= 0;i--) { //将整个二叉树调整成为小顶堆 adjustMinHeap(a, i, len - 1); } for(int i = len - 1;i>=0;i--) { //交换堆顶位置和最后一个位置处的值,然后再调整成为小顶堆 int temp = a[0]; a[0] = a[i]; a[i] = temp; adjustMinHeap(a, 0, i - 1); } } public static void main(String[] args) { /*int[] a = {21,32,123,12,4543,12,354235,2,4,32,525432,425253,4,23,5,35}; selectSort(a); for (int i : a) { System.out.println(i); }*/ /*MyInt firstNum = new MyInt(5); MyInt secondNum = new MyInt(10); swap(firstNum, secondNum); System.out.println(firstNum.data); System.out.println(secondNum.data);*/ int[] a = {21,32,123,12,4543,12,354235,2,4,32,525432,425253,4,23,5,35}; // bubbleSort(a); //mergeSort(a, 0, a.length - 1); //quickSort(a, 0, a.length - 1); // shellSort(a); heapSort(a); System.out.println(Arrays.toString(a)); }
数据结构与算法排序算法java描述
猜你喜欢
转载自blog.csdn.net/yamanda/article/details/80706356
今日推荐
周排行