1.简单排序
简述
希尔排序是插入排序的改进版
package SortLearn;
public class easySort<T extends Comparable<T>> extends Sort<T> {
public void sort(T[] nums){
int N = nums.length;
for(int i=0;i<N-1;i++){
int min = i;
for(int j=i;j<N;j++){
if(less(nums[j],nums[min])){
min=j;
}
}
swap(nums,i,min);
}
}
}
class Bubble<T extends Comparable<T>> extends Sort<T>{
public void sort(T[] nums){
int N = nums.length;
boolean hasSorted = false;
for(int i=N-1;i>0&&hasSorted;i++){
hasSorted=true;
for(int j=0;j<i;j++){
if(less(nums[j+1],nums[j])){
swap(nums,j,j+1);
hasSorted=false;
}
}
if(hasSorted==true)
return;
}
}
}
class Intertion<T extends Comparable<T>> extends Sort<T>{
public void sort(T []nums){
int N=nums.length;
for(int i = 1;i<N;i++){
for(int j=i;j>0&&less(nums[j],nums[j-1]);j--){
swap(nums,j,j-1);
}
}
}
}
class Shell<T extends Comparable<T>> extends Sort<T>{
public void sort(T[]nums){
int N = nums.length;
int h=1;
while(h<N/3){
h=h*3+1;
}
while(h>=1){
for(int i=h;i<N;i++){
for(int j=i;j>=h&&less(nums[j],nums[j-h]);j=j-h){
swap(nums,j,j-h);
}
}
h=h/3;
}
}
}
2.归并排序
简述
归并排序需要额外的空间 将数组分成两部分 分别排序 然后再归并
package SortLearn;
public class MergeSort<T extends Comparable<T>> extends Sort<T> {
protected T[] aux;
protected void merge(T[] nums,int l,int m,int h){
int i=l,j=m+1;
for(int k=l;k<=h;k++){
aux[k]=nums[k];
}
for(int k=l;k<=h;k++){
if(i>m){
nums[k]=aux[j++];
}else if(j>h){
nums[k]=aux[i++];
}else if(aux[i].compareTo(nums[j])<0){
nums[k]=aux[i++];
}else{
nums[k]=aux[j++];
}
}
}
}
class Up2DownMergerSort<T extends Comparable<T>>extends MergeSort<T>{
public void sort(T[]nums){
sort(nums,0,nums.length-1);
}
private void sort(T[]nums,int l,int h){
if(l<h){
int m=l+(h-l)/2;
sort(nums,l,m);
sort(nums,m+1,h);
merge(nums,l,m,h);
}
}
}
class Down2UpMergeSort<T extends Comparable<T>> extends MergeSort<T>{
public void sort(T[] nums){
int N = nums.length;
aux =(T[])new Comparable[N];
for(int sz=1;sz<N;sz=sz*2){
for(int l=0;l<N-sz;l+=sz*2){
merge(nums,l,l+sz-1,Math.min(l+sz+sz-1,N-1));
}
}
}
}
3.快排
简述
快排需要调用递归 需要辅助栈 是不稳定的排序 留意partition部分 小于arr[0]的在左边 大于的在右边 递归调用
package SortLearn;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class QuickSort<T extends Comparable<T>> extends Sort<T> {
public void sort(T[]nums){
shuffle(nums);
sort(nums,0,nums.length-1);
}
public void sort(T[]nums,int l,int h){
if(h<=l){
return;
}
int j=partition(nums,l,h);
sort(nums,l,j-1);
sort(nums,j+1,h);
}
private void shuffle(T[] nums){
List<Comparable> list = Arrays.asList(nums);
Collections.shuffle(list);
list.toArray(nums);
}
private int partition(T[]nums,int l,int h){
int i= l,int j=h+1;
T v=nums[l];
while(true){
while(less(nums[++i],v)&& (i!=h));
while(less(v,nums[--j])&&(j!=l));
if(i>=j){
break;
}
swap(nums,i,j);
}
swap(nums,l,j);
return j;
}
}
class ThreeWayQuikSort<T extends Comparable<T>>extends QuickSort<T>{
public void sort(T[] nums,int l,int h){
if(h<=l){
return;
}
int lt =l,i=l+1,gt=h;
T v =nums[l];
while(i<=gt){
int cmp =nums[i].compareTo(v);
if(cmp<0){
swap(nums,i++,lt++);
}else if(cmp>0){
swap(nums,i,gt--);
}else{
i++;
}
}
sort(nums,l,lt-1);
sort(nums,gt+1,h);
}
}
class Select{
public int select(T[]nums,int k){
int l=0,h=nums.length-1;
while(h>l){
int j=partition(nums,l,h);
if(j==k){
return nums[k];
}else if(j>k){
h=j-1;
}else{
l=j+1;
}
}
return nums[k];
}
}
4.堆排序
简介
首先理解什么是堆 最大堆与最小堆 上浮与下沉的思想 排序的时候 用根节点与最后一个交换 再让它下沉 再次形成一个堆
步骤1生成堆 步骤2 取根节点与最后一个交换 3.根节点下沉 重新生成堆 此时N=N-1
package SortLearn;
public class Heap<T extends Comparable<T>> {
private T[] heap;
private int N=0;
public Heap(int maxN){
this.heap =(T[])new Comparable[maxN+1];
}
public boolean isEmpty(){
return N==0;
}
public int size(){
return N;
}
private boolean less(int i,int j){
return heap[i].compareTo(heap[j])<0;
}
private void swap(int i,int j){
T t =heap[i];
heap[i]=heap[j];
heap[j]=t;
}
private void swim(int k){
while(k>1 &&(less(k/2,k))){
swap(k/2,k);
k=k/2;
}
}
private void sink(int k){
while(2*k<=N){
int j =2*k;
if(j<N &&less(j,j+1)){
j++;
}
if(!less(k,j)){
break;
}
swap(k,j);
k=j;
}
}
public void innsert(T v){
heap[++N]= v;
swim(N);
}
public T delMax(){
T max =heap[1];
swap(1,N--);
sink(1);
heap[++N]=null;
return max;
}
}
class HeapSort<T extends Comparable<T>>extends Sort<T>{
public void sort(T[] nums){
int N=nums.length-1;
for(int i =N/2;i>1;i++)}
sink(nums,i,N);
}
while(N>1){
swap(nums,1,N--);
sink(nums,1,N);
}
}
private void sink(T[] nums,int i,int N){
while(2*i<=N){
int j = 2*i;
if(j<N&&less(nums,j,j+1)){
j++;
}
if(!less(nums,i,j)){
break;
}
swap(nums,i,j);
i=j;
}
}
public boolean less(T[]nums,int i,int j){
return nums[i].compareTo(nums[j])<0;
}
}
5.排序总结
归并排序稳定 但是空间复杂度是N 堆排序空间复杂度是1 但是不稳定
java.util.Arrays.sort(),对于原始数据类型使用三向切分的快速排序,对于引用类型使用归并排序 考虑了稳定性
![排序算法总结](https://i-blog.csdnimg.cn/blog_migrate/097d489d3455fa45dcb9fe8e76e0add0.png)