本文共 5877 字,大约阅读时间需要 19 分钟。
复杂度:
class Solution1 { public int[] sortArray(int[] nums) { for (int i = 0; i < nums.length; i++) { int min = Integer.MAX_VALUE; int index = i; for (int j = i; j < nums.length; j++) { 1.记录下标 index = nums[j]
复杂度:
class Solution2 { public int[] sortArray(int[] nums) { 1.外层for前序遍历 for (int i = 0; i < nums.length; i++) { 2.内层for后序遍历 for (int j = nums.length-1; j >i ; j--) { if (nums[i]>nums[j]) swap(nums,i,j); } } return nums; } public void swap(int[] nums,int i,int j){ int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; }}
(3, 2), (3, 1), (5, 2), (5, 4), (5, 1), (2, 1), (4, 1),
复杂度:
class Solution4 { public int[] sortArray(int[] nums) { for (int i = 1; i < nums.length; i++) { for (int j = i; j > 0 && nums[j]
1.对于大规模数组,插入排序很慢,因为它每次只能把逆序的数量减少1
希尔排序优化了插入排序,每次可以让逆序减少的数量>1;
希尔排序使用插入排序对间隔h的序列进行排序,通过不断减小h,最后令h=1,就可以得到整个有序数组
2.复杂度:
class Solution5 { public int[] sortArray(int[] nums) { int N = nums.length; int h = 1; while (h=1){ for (int i = h; i < nums.length; i++) { for (int j = i; j >= h && nums[j]
1.堆中某个节点的值总是大于等于 或者小于等于 其子节点的值,并且堆是 完全二叉树、
1.堆可以用数组来表示,这是因为堆是完全二叉树,而完全二叉树很容易就存储在数组中。
2.位置 k 的节点的父节点位置为 k/2,而它的两个子节点的位置分别为 2k 和 2k+1。
3.这里不使用数组索引为 0 的位置,是为了更清晰地描述节点的位置关系。
2.复杂度:
class Solution { public int[] sortArray(int[] nums) { sortHeap(nums); return nums; } 1.堆排序 public void sortHeap(int[] arr){ 1.先初步建立大顶堆,不管叶子节点 for (int i = (arr.length/2)-1; i >=0 ; i--) { bigHeapBuid(arr, arr.length, i); } for (int i = arr.length-1; i >=0 ; i--) { swap(arr,0,i); 依次把在下标0处 冒头的 元素揪到后面 bigHeapBuid(arr, i,0);对新换上去的 下标0元素,进行堆整理,确保其为 去顶后的最大值 } } //2.构造大顶堆 public void bigHeapBuid(int[] arr,int len,int root){ int largest = root; 假设根节点是最大节点 int left = 2*root+1; int right = 2*root+2; 第一个判断条件,保证左下标不会超过树的全部节点,也就是说不会取到1个 out of index 的节点 if (leftarr[largest]) largest=left; if (right arr[largest]) largest=right; 满足这个条件说明,原root不是最大节点,需要进行节点交换,把最大值换上去 if (largest!=root){ swap(arr, largest, root); 因为largest下标所在元素被下来的原root替换了 所以要对其递归,确保换下来的元素 在该分支子树上是最大的 bigHeapBuid(arr, len, largest); } } public void swap(int[] nums,int i,int j){ int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; }}
2.构造小顶堆 public void smallHeapBuid(int[] arr,int len,int root){ int lowest = root; 假设根节点是最小节点 int left = 2*root+1; int right = 2*root+2; 第一个判断条件,保证左下标不会超过树的全部节点,也就是说不会取到1个 out of index 的节点 if (left
1.merge()函数
2.递推公式class Solution { public int[] sortArray(int[] nums) { sort(nums,0, nums.length-1); return nums; } 归并排序递归主体 public void sort(int[] nums,int low,int high){ if (low>=high) return ; int mid = (low+high)/2; sort(nums, low, mid); sort(nums, mid+1, high); merge(nums,low,mid,high); } 归并方法,把数组中两个已经排序的部分合成一个 public void merge(int[] nums,int low,int mid,int high){ int nL = mid-low+1,nR = high-mid; 1.建立辅助数组 int[] numsLeft = new int[nL]; int[] numsRight = new int[nR]; 2.给辅助数组赋值,注意下标 for (int k = 0; k < nL; k++) { numsLeft[k] = nums[low+k]; 注意此处nums下标 } for (int k = 0; k < nR; k++) { numsRight[k]=nums[mid+1+k]; 注意此处nums下标 } int i=0,j=0,k=low; while (i
1.思想:
2.复杂度
1.partition() 分割函数
2.递推公式。class Solution { public int[] sortArray(int[] nums) { sort(nums,0, nums.length-1); return nums; } public void sort(int[] nums,int low ,int high){ if (low>=high)return; 1.找出分割基准 int partiti = partition(nums, low, high); 2.递归sort sort(nums, low, partiti-1); sort(nums, partiti+1, high); } public int partition(int[] nums,int low,int high){ int base = nums[low]; 这里选择基准时,如果是low,就要先做从后向前的遍历 //int base = nums[high]; 这里选择基准时,如果是high,就要先做从前向后的遍历 int left = low,right=high; while (left=号!!! while (left =base) right--; 右子数组 >=切分元素!!! 2.后 从前向后遍历 ,这里要注意是>=号!!! while (left
转载地址:http://nqqn.baihongyu.com/