排序算法 分治-快速-堆排序
快速排序
private static void sort(int[] arr, int left, int right) {
if(left>=right) return;
int leftIndex=left;
int rightIndex =right;
int key = left;
while (leftIndex<rightIndex){
while(leftIndex<rightIndex && (arr[rightIndex]>=arr[key]))rightIndex--;
while(leftIndex<rightIndex && arr[leftIndex]<=arr[key])leftIndex++;
if(leftIndex<rightIndex){
int tmp= arr[leftIndex] ; arr[leftIndex] = arr[rightIndex]; arr[rightIndex] = tmp;
}
}
int tmp= arr[key] ; arr[key] = arr[rightIndex]; arr[rightIndex] = tmp;
sort(arr,left,rightIndex-1);
sort(arr,rightIndex+1,right);
}
归并排序
public static void mergeSort(int[] arr,int l,int r) { //对 l~r 排序 if (l>=r) return; int q = (l+r)/2; mergeSort(arr,l,q); 对l~q排序 mergeSort(arr,q+1,r); 对q+1~r 排序
merge(arr,l,q,r); 合并2个数组 }
public static void merge(int[] arr,int l,int q,int r){
新建一个数组
循环L1 L2长度>0
循环L1
循环L2
}
堆排序
大顶堆 小顶堆
完全二叉树
第一步构建大顶堆
第二部循环 ,每层循环调整堆 满足性质
private static void heapSort(int[] arr) { //创建堆 for (int i = (arr.length - 1) / 2; i >= 0; i--) { //从第一个非叶子结点从下至上,从右至左调整结构 adjustHeap(arr, i, arr.length); } //调整堆结构+交换堆顶元素与末尾元素 for (int i = arr.length - 1; i > 0; i--) { //将堆顶元素与末尾元素进行交换 swap();//重新对堆进行调整 adjustHeap(arr, 0, i); } } private static void adjustHeap(int[] arr, int parent, int length) { //将temp作为父节点 int temp = arr[parent]; int l= 2 * parent + 1; while (l < length) { //右孩子 int r= l + 1; // 如果有右孩子结点,并且右孩子结点的值大于左孩子结点,则选取右孩子结点 if (r< length && arr[l] < arr[r]) l++; // 如果父结点的值已经大于孩子结点的值,则直接结束 if (temp >= arr[l]) break; // 把孩子结点的值赋给父结点 arr[parent] = arr[l]; //选取孩子结点的左孩子结点,继续向下筛选 parent = l; l= 2 * l+ 1; } arr[parent] = temp; } }