1.mergeSort O(nlogn)的时间复杂度,需要O(n)的额外空间。
1 public void sortIntegers2(int[] A) { 2 // Write your code here 3 if (A == null || A.length == 0) { 4 return ; 5 } 6 int[] temp = new int[A.length]; 7 mergeSort(A, 0, A.length - 1, temp); 8 } 9 10 private void mergeSort(int[] A, int start, int end, int[] temp) { 11 if (start == end) { 12 return ; 13 } 14 int mid = start + (end - start) / 2; 15 mergeSort(A, start, mid, temp); 16 mergeSort(A, mid + 1, end, temp); 17 merge(A, start, mid, end, temp); 18 } 19 20 private void merge(int[] A, int start, int mid, int end, int[] temp) { 21 int index = start; 22 int left = start; 23 int right = mid + 1; 24 while(left <= mid && right <= end) { 25 if (A[left] < A[right]) { 26 temp[index++] = A[left++]; 27 } else { 28 temp[index++] = A[right++]; 29 } 30 } 31 while (left <= mid) { 32 temp[index++] = A[left++]; 33 } 34 while (right <= end) { 35 temp[index++] = A[right++]; 36 } 37 for (int i = start; i <= end; i++) { 38 A[i] = temp[i]; 39 } 40 }
2.quickSort O(nlogn)的时间复杂度,需要O(1)的额外空间
1 public void sortIntegers2(int[] A) { 2 // Write your code here 3 if (A == null || A.length == 0) { 4 return ; 5 } 6 quickSort(A, 0, A.length - 1); 7 } 8 9 private void quickSort(int[] A, int start, int end) { 10 if (start >= end) { 11 return ; 12 } 13 int pivot = getPivot(A, start, end); 14 int i = start; 15 int j = end; 16 while (i <= j) { 17 while (i <= j && A[i] < pivot) { 18 i++; 19 } 20 while (i <= j && A[j] > pivot) { 21 j--; 22 } 23 if (i <= j) { 24 swap(A, i, j); 25 i++; 26 j--; 27 } 28 } 29 quickSort(A, start, j);//Attention 30 quickSort(A, i, end);//Attention 31 } 32 33 private int getPivot(int[] A, int start, int end) { 34 Random random = new Random(); 35 int index = random.nextInt(end - start + 1); 36 return A[start + index]; 37 } 38 39 private void swap(int[] A, int i, int j) { 40 int temp = A[i]; 41 A[i] = A[j]; 42 A[j] = temp; 43 }
3.insertionSort O(n^2)的时间复杂度, 需要O(1)的额外空间。
1 private void insertionSort(int[] A) { 2 for (int p = 1; p < A.length; p++) { 3 int j; 4 int temp = A[p]; 5 for (j = p; j > 0 && A[j - 1] > temp ; j--) { 6 A[j] = A[j - 1]; 7 } 8 A[j] = temp; 9 } 10 }
4.Insertion Sort List O(n^2)时间复杂度,需要O(1)的额外空间
链表插入排序
真是尴尬,开始时受到数组插入排序的影响,总想着从有序部分的后面开始寻找插入位置,还想着怎么搞一个指向前边的指针,定式思维的危害啊。。。
其实从有序部分的前边开始寻找插入位置就可以了嘛
需要注意的是:
dummy.next 并没有指向head,有序部分的最后一个节点指向的是null,这就可以作为每轮插入的一个循环控制条件。
1 public ListNode insertionSortList(ListNode head) { 2 ListNode dummy = new ListNode(0); 3 while (head != null) { 4 ListNode node = dummy; 5 while (node.next != null && node.next.val < head.val) { 6 node = node.next; 7 } 8 ListNode temp = head.next; 9 head.next = node.next; 10 node.next = head; 11 head = temp; 12 } 13 return dummy.next; 14 }
5.归并排序
1 public ListNode sortList(ListNode head) { 2 return mergeSort(head); 3 } 4 public ListNode mergeSort(ListNode head) { 5 if (head == null || head.next == null) { 6 return head; 7 } 8 ListNode middle = findMiddle(head); 9 ListNode right = middle.next; 10 middle.next = null; 11 ListNode left = mergeSort(head); 12 right = mergeSort(right); 13 return merge(left, right); 14 } 15 public ListNode merge(ListNode left, ListNode right) { 16 ListNode dummy = new ListNode(0); 17 ListNode tail = dummy; 18 while (left != null && right != null) { 19 if (left.val < right.val) { 20 tail.next = left; 21 tail = left; 22 left = left.next; 23 } else { 24 tail.next = right; 25 tail = right; 26 right = right.next; 27 } 28 } 29 tail.next = left == null ? right : left; 30 return dummy.next; 31 } 32 public ListNode findMiddle(ListNode head) { 33 ListNode right = head; 34 ListNode dummy = new ListNode(0); 35 dummy.next = head; 36 ListNode left = dummy; 37 while (right != null && right.next != null) { 38 right = right.next.next; 39 left = left.next; 40 } 41 return left; 42 }
6.单项链表冒泡排序
public static ListNode bubbleSort(ListNode head) { ListNode dummyHead = new ListNode(0); dummyHead.next = head; ListNode cur = head; int count = 0; while (cur != null) { count++; cur = cur.next; } ListNode prev = dummyHead; for (int i = count; i > 0; i--) { prev = dummyHead; cur = prev.next; // Attention! int j = 0; while (j < i - 1) { if (cur.val > cur.next.val) { ListNode temp = cur.next.next; prev.next = cur.next; cur.next.next = cur; cur.next = temp; } prev = prev.next; cur = prev.next; j++; } } return dummyHead.next; }