# sort
# 1 插入排序
class Solution {
public int[] sortArray(int[] nums) {
int len= nums.length;
for(int i = 0; i<len; i++){
for(int j = i; j>0 && (nums[j] <nums[j-1]); j--){
// j>0 不等于0 , 因为nums[j] <nums[j-1]
exch(nums, j-1, j);
}
}
return nums;
}
private void exch(int[] nums, int i, int j){
int t =nums[i];
nums[i] = nums[j];
nums[j] =t;
}
}
# 2 快速排序
颜色分类(荷兰国旗)
正常排序数组
颜色分类
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
class Solution {
public void sortColors(int[] nums) {
int len = nums.length-1;
int lo = 0, i = lo;
//key i开始的位置, 与确定大小的元素对比时 从0开始
// 与第一个元素相比的时候(sort array);
while(i <= len){
if(nums[i] < 1){
swap(nums,i++, lo++);
}
else if(nums[i] > 1){
swap(nums, i, len--);
}
else{
i++;
}
}
}
private void swap(int[]nums, int i , int j){
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}
- 排序数组
- nums = { 2,4,5,1,4,8,3};
class Solution {
public int[] sortArray(int[] nums) {
quick(nums, 0, nums.length-1);
return nums;
}
public void quick(int[] nums, int lo, int hi){
if(hi<=lo) return;
int lt = lo, i = lo+1, gt = hi;
int c = nums[lo];
while(i<=gt){
if(nums[i] < c ){
exch(nums, i++, lt++);
}
else if(nums[i]> c){
exch(nums, gt--, i);
}
else {
i++;
}
}
quick (nums,lo, lt-1);
quick(nums,gt+1, hi);
}
private void exch(int[] nums, int i, int j){
int t =nums[i];
nums[i] = nums[j];
nums[j] =t;
}
}
# 3 heapsort
- 堆构造阶段: 从右到左利用sink()构造子堆。从右中点sink()到左, 一半的有序, 后半部分就是叶子节点
- 下沉排序:
public class Heap{
public static void sort(Comparable[] a){
int n = a.length;
for (int k = n/2; k >= 1; k--)
sink(a, k, n);
while (n > 1){
exch(a, 1, n);
sink(a, 1, --n);
}
}
private static void sink(Comparable[] a, int k, int n){ /* as before */ }
private static boolean less(Comparable[] a, int i, int j)
{ /* as before */ }
private static void exch(Object[] a, int i, int j)
{ /* as before */ }
}