搜索
您的当前位置:首页正文

八大经典排序算法的代码实现

来源:小奈知识网

冒泡排序:

插入排序:

选择排序:

归并排序:

快速排序:

 1 import java.util.Arrays;
 2 
 3 //快排
 4 //时间复杂度最好为O(NlogN). 数组逆序的时候最差,时间复杂度为O(N^2),可以通过随机快排的方式使得其长期时间复杂度期望为O(N*logN)
 5 //空间复杂度最好为O(logN),数组逆序的时候最差,空间复杂度为O(N),额外空间主要是每次partition函数返回的二元数组造成的。
 6 //通过随机快排的方式使得其长期时间复杂度期望为O(logN)
 7 //所有递归函数都可以改为非递归版本,因为递归的本质行为是系统在帮我们压栈。改为非递归就是改成我们自己来压栈
 8 // 在工程上是不允许递归行为存在的,因为递归过深可能会导致系统栈爆满,系统不稳定。因此工程上的快排都是非递归版本实现的。
 9 //库函数都是高度优化过的
10 public class QuickSort {
11 
12     static void quickSort(int[] arr, int L, int R) {
13         if (L < R) {
14 //            随机快排, 每次将中间随机一个数和数列最后一个元素交换位置,放置逆序数列产生差的结果
15             swap(arr, L + (int) (Math.random() * (R - L + 1)), R);
16             int[] p = partition(arr, L, R);
17             quickSort(arr, L, p[0] - 1);
18             quickSort(arr, p[1] + 1, R);
19         }
20     }
21 
22     static int[] partition(int[] arr, int L, int R) {
23         int less = L - 1;
24         int more = R;
25         int cur = L;
26 //        以arr[R]作为基准,有了随机快排,这里的arr[R]被重新洗牌
27 //        这里一次性处理了大于基准等于基准和小于基准的三种情况,速度比传统快排要快
28         while (cur < more) {
29             if (arr[cur] < arr[R]) {
30                 // cur++,因为换到cur位置上的一定是比基准arr[R]小的数,直接将其扩到less范围去,且cur指向下一位置
31                 swap(arr, ++less, cur++);
32             } else if (arr[cur] > arr[R]) {
33                 //交换到cur位置上的数大小位置,交换过去的数一定大于基准arr[R], 故more--,将其扩到more区域, 但cur位置不变
34                 swap(arr, --more, cur);
35             } else {
36                 //当前位置和基准arr[R]相等,不扩到less区域和more区域,放在相等区域
37                 cur++;
38             }
39         }
40         //最后将基准交换到more区域的下一位置
41         swap(arr, more, R);
42        // 返回相等区域下标,注意此时more位置上是交换过来的基准值,不用加1
43         return new int[]{less + 1, more};
44     }
45 
46     static void swap(int[] arr, int i, int j) {
47         int tmp = arr[i];
48         arr[i] = arr[j];
49         arr[j] = tmp;
50     }
51 
52     public static void main(String[] args) {
53         int a[] = {49, 38, 65, 97, 76, 13, 27, 49};
54         quickSort(a, 0, a.length - 1);
55         System.out.println(Arrays.toString(a));
56     }
57 }
快排

堆排序:

 1 import java.util.Arrays;
 2 
 3 //堆排序
 4 //堆是完全二叉树
 5 //二叉树的底层可以用线性的结构来储存,也就是说可以用数组来储存一个二叉树,通过数组中下标的关系来表示这个堆。设完全二叉树的一个节点在数组中的下标为i,
 6 //则其父节点的下标应该为(i-1)/2,其左孩子节点应该是2*i+1, 其右孩子节点应该为2*i+2
 7 public class HeapSort {
 8     static void heapSort(int[] arr) {
 9         if (arr == null || arr.length < 2)
10             return;
11         else
12             for (int i = 0; i < arr.length; i++)
13                 heapInsert(arr, i);
14 
15         int heapSize = arr.length;//堆的大小等于数组的长度
16         //交换堆顶和最后一个元素
17         swap(arr, 0, --heapSize);
18         while (heapSize > 0) {
19             heapify(arr, 0, heapSize);
20             swap(arr, 0, --heapSize);
21         }
22     }
23 
24     static void heapInsert(int[] arr, int index) {
25         while (arr[(index - 1) / 2] < arr[index]) {//如果index=0, -1/2=0是根节点
26             swap(arr, index, (index - 1) / 2);
27             index = (index - 1) / 2;
28         }
29 
30     }
31 
32     //    如果堆中有某个元素变小了,将这个元素下沉以保持大根堆的过程heapify
33     static void heapify(int[] arr, int index, int heapSize) {
34         int left = index * 2 + 1;//在用数组存储的堆中,节点i的左孩子节点是2*i+1, 右节点是2*i+2;
35         //这里heapSize是最后一个元素,做堆排的时候,因为是从堆顶交换来的最大值,所以重新heapify要把它排除在外;
36         while (left < heapSize) {
37             int largest = left + 1 < heapSize && arr[left + 1] > arr[left] ? left + 1 : left;
38             largest = arr[index] > arr[largest] ? index : largest;
39             if (largest == index) {
40                 break;
41             }
42             swap(arr, largest, index);
43             index = largest;
44             left = index * 2 + 1;
45         }
46     }
47 
48     static void swap(int[] arr, int i, int j) {
49         int tmp = arr[i];
50         arr[i] = arr[j];
51         arr[j] = tmp;
52     }
53 
54     public static void main(String[] args) {
55         int a[] = {49, 38, 65, 97, 76, 13, 27, 49};
56         heapSort(a);
57         System.out.println(Arrays.toString(a));
58     }
59 }
堆排序

希尔排序:

基数排序:

 

转载于:https://www.cnblogs.com/greatLong/p/10562405.html

因篇幅问题不能全部显示,请点此查看更多更全内容

Top