排序总结(java)

Posted on 2019-03-29 21:27  ANONY_MOUSER  阅读(124)  评论(0)    收藏  举报
  1 public class sort {
  2     public static void main(String[] args) {
  3         int[] arr = {2, 5, 3, 4, 8, 5, 1};
  4         //sort_insert(arr);
  5         //sort_bin(arr);
  6         //sort_bubble(arr);
  7         sort_quick(arr,0,6);
  8         //sort_select(arr);
  9         for (int i = 0; i < arr.length; i++) {
 10             System.out.print(arr[i] + " ");
 11         }
 12     }
 13 
 14     //直接插入排序
 15     public static void sort_insert(int[] arr) {
 16         int n = arr.length;
 17         int temp;
 18         for (int i = 1; i < n; i++) {
 19             if (arr[i] < arr[i - 1]) {//如果后面的小于前面的
 20                 int j = i - 1;
 21                 temp = arr[i];//因为往后会淹没要插入的
 22                 //下面的while是只要大于就后移一位,直到可以插入
 23                 while (j >= 0 && temp < arr[j]) {
 24                     arr[j + 1] = arr[j];
 25                     j--;
 26                 }
 27                 arr[j + 1] = temp;
 28             }
 29         }
 30     }
 31 
 32     //折半插入排序
 33     public static void sort_bin(int[] arr) {
 34         int i, j, low, high, mid, temp;
 35         int n = arr.length;
 36         for (i = 1; i < n; i++) {
 37             temp = arr[i];
 38             low = 0;
 39             high = i - 1;
 40             while (low <= high) {
 41                 mid = (low + high) / 2;
 42                 if (temp > arr[mid]) {
 43                     low = mid + 1;
 44                 } else {
 45                     high = mid - 1;
 46                 }
 47             }
 48             for (j = i; j > low; j--) {
 49                 arr[j] = arr[j - 1];
 50             }
 51             arr[low] = temp;
 52 
 53         }
 54 
 55     }
 56 
 57     //冒泡排序
 58     public static void sort_bubble(int[] arr) {
 59         for (int i = 0; i < arr.length; i++) {
 60             for (int j = 0; j < arr.length - i - 1; j++) {
 61                 if (arr[j] > arr[j + 1]) {
 62                     int temp = arr[j];
 63                     arr[j] = arr[j + 1];
 64                     arr[j + 1] = temp;
 65                 }
 66             }
 67         }
 68     }
 69 
 70     //快速排序
 71     public static void sort_quick(int[] arr, int left, int right) {
 72         int temp;
 73         int i = left, j = right;
 74         if (left < right) {
 75             temp = arr[left];
 76             //完成一趟循环,将数组小于temp的放在左边,大于temp的放在右边
 77             while (i != j) {//相等时候说明相遇了,此时i的位置就是插入的位置
 78                 //从右往左找到一个小于temp的元素
 79                 while (j > i && arr[j] > temp) {
 80                     --j;
 81                 }
 82                 if (i < j) {
 83                     arr[i] = arr[j];
 84                     ++i;//指针右移动一位
 85                 }
 86                 //从左往右找,找到一个大于temp的元素
 87                 while (i < j && arr[i] < temp) {
 88                     i++;
 89                 }
 90                 if (i < j) {
 91                     arr[j] = arr[i];
 92                     j--;//指针向前一位,刚移动的
 93                 }
 94 
 95             }
 96             arr[i] = temp;
 97             sort_quick(arr, left, i - 1);
 98             sort_quick(arr, i + 1, right);
 99         }
100 
101     }
102 
103     //简单选择排序,在无序序列选最小的放到有序的上面
104     public static void sort_select(int[] arr) {
105         for (int i = 0; i < arr.length; i++) {
106             //记住最小的序号,默认第一个
107             int min = i;
108             for (int j = i + 1; j < arr.length; j++) {
109                 if (arr[j] < arr[min]) {
110                     min = j;
111                 }
112             }
113             //交换当前i序号与得到最小的
114             int temp = arr[i];
115             arr[i] = arr[min];
116             arr[min] = temp;
117         }
118     }
119 }