排序算法

快排序:平均时间复杂度为o(nlogn)

其主要思想就是

1.先从数列中取出一个数作为基准数。

2.将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.左右区间重复第二步,直到各区间只有一个数。

 1  public void quickSort(int[] arr, int x, int y) {
 2        if (x < y) {
 3            int index = partition(arr, x, y);
 4            quickSort(arr, x, index-1);
 5            quickSort(arr, index+1, y);
 6        }
 7     }
 8     
 9     public int partition(int[] arr, int i, int j) {
10         int left = i, right = j;
11         int temp = arr[i];
12         while (left < right) {
13 
14             while (left < right && temp <= arr[right]) {
15                 right--;
16             }
17             if (left < right) {
18                 arr[left] = arr[right];
19             }
20 
21             while (left < right && temp > arr[left]) {
22                 left++;
23             }
24 
25             if (left < right) {
26                 arr[right] = arr[left];
27             }
28         }
29         arr[left] = temp;
30         return left;
31     }

归并排序:是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。最大 最小和平均时间复杂度都为nlogn。

 1 public void mergeSort(int[] arr, int i, int j) {
 2         if (i < j) {
 3             int mid = (i + j) / 2;
 4             mergeSort(arr, i, mid);
 5             mergeSort(arr, mid + 1, j);
 6             merge(arr, i, j, mid);
 7         }
 8     }
 9     //合并
10     public void merge(int[] arr, int left, int right, int mid) {
11         int[] temp = new int[arr.length];
12         int i = left;
13         int j = mid + 1;
14         int t = 0;
15 
16         while (i <= mid && j <= right) {
17             if (arr[i] <= arr[j]) {
18                 temp[t++] = arr[i++];
19             } else {
20                 temp[t++] = arr[j++];
21             }
22         }
23 
24         while (i <= mid) {
25             temp[t++] = arr[i++];
26         }
27 
28         while (j <= right) {
29             temp[t++] = arr[j++];
30         }
31 
32         t = 0;
33         while (left <= right) {
34             arr[left++] = temp[t++];
35         }
36     }

冒泡排序:上浮法或者下沉法。将数组中的值逐个比较,将其移动到数组的上面。

上浮法冒泡:时间复杂度o(n)

 1 public void  mSort(int[] arr){
 2         for (int i = 0; i < arr.length; i++) {
 3             int temp = arr[i];
 4             for (int j = i + 1; j < arr.length; j++) {
 5                 if (arr[j] < temp) {
 6                     temp = arr[j];
 7                     arr[j] = arr[i];
 8                     arr[i] = temp;
 9                 }
10             }
11         }
12     }

 

插入排序:

 1  public void insertSort(int[] arr) {
 2         for (int i = 0; i < arr.length; i++) {
 3             for (int j = i; j > 0; j--) {
 4                 if (arr[j - 1] > arr[j]) {
 5                     int temp = arr[j];
 6                     arr[j] = arr[j - 1];
 7                     arr[j - 1] = temp;
 8                 }
 9             }
10         }
11     }

 

posted @ 2020-04-24 17:21  seedss  阅读(134)  评论(0编辑  收藏  举报