第二课:复杂排序算法

1.归并排序

	public static void mergeSort(int[] arr) {
		if(arr==null||arr.length<2){
			return;
		}
		mergeSort(arr,0,arr.length-1);
	}
	public static void mergeSort(int[] arr, int l, int r) {
		if (l==r){
			return;
		}
		int mid=l+(r-l)/2;
		mergeSort(arr,l,mid);
		mergeSort(arr,mid+1,r);
		merge(arr,l,mid,r);
	}
	public static void merge(int[] arr, int l, int m, int r) {
		int[] newArr =new int[r-l+1]; //注意这里数组定义的长度
		int left1=l;
		int left2=m+1;
		int i=0;
		while(left1<m+1&&left2<r+1){
			if (arr[left1]<=arr[left2]){
				newArr[i]=arr[left1];
				left1++;
				i++;
			}else{
				newArr[i]=arr[left2];
				left2++;
				i++;
			}
		}
		if (left1==m+1){
			while(left2<r+1){
				newArr[i++]=arr[left2++];
			}
		}
		if (left2==r+1){
			while(left1<m+1){
				newArr[i++]=arr[left1++];
			}
		}
		for (int j=0;j<newArr.length;j++){
			arr[l+j]=newArr[j];
		}
	}

2.荷兰国旗问题
1)小于等于的放左边,大于的放右边

	private static void sort(int[] test, int i, int length, int num) {
		int border=-1;
		for(int j=0;j<length;j++){
			if (test[j]<=num){
				swap(test,border+1,j);//注意交换放的是下标
				border++;
			}
		}
		printArray(test);
	}

2)小于的放左边,等于的放中间,大于的放右边

	public static int[] partition(int[] arr, int l, int r, int num) {
		int small=l-1;
		int big=r+1;
		while (l<big){
			if(arr[l]<num){
				swap(arr,small+1,l);
				small++;
				l++;     //注意当前数小于num的话l是要自增的
			}else if(arr[l]>num){
				swap(arr,big-1,l);
				big--;	//注意当前数大于num的话l是不需要自增的
			}else {
				l++;
			}
		}
		return arr;
	}

3.快速排序

	public static void quickSort(int[] arr) {
		if (arr==null||arr.length<2){
			return;
		}
		quickSort(arr,0,arr.length-1);
	}
	public static void quickSort(int[] arr, int l, int r) {
		if(l<r){//注意这个条件
			int[] p=partition(arr,l,r);
			quickSort(arr,l,p[0]);
			quickSort(arr,p[1],r);
		}
	}
	public static int[] partition(int[] arr, int l, int r) {
		int less=l-1; //小于的边界
		int more=r;	//大于的边界
		while(l<more){  //l是遍历的元素
			if (arr[l]<arr[r]){   //arr[r]是标杆元素
				less++;
				swap(arr,less,l);
				l++;
			}else if(arr[l]>arr[r]){
				more--;
				swap(arr,l,more);
			}else{
				l++;
			}
		}
		swap(arr,l,r);//注意这里是要交换的
		return new int[]{less,more+1};//注意返回的是less
	}

	public static void swap(int[] arr, int i, int j) {
		int tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
	}

4.堆排序

	public static void heapSort(int[] arr) {
		if(arr==null||arr.length<2){
			return;
		}
		//建堆方式一
//		for (int heapsize=0;heapsize<arr.length;heapsize++){
//			heapInsert(arr,heapsize);
//		}
		//建堆方式二
		for(int i=(arr.length-2)/2;i>=0;i--){
			heapify(arr,i,arr.length);
		}
		for(int i=arr.length-1;i>0;i--){
			swap(arr,0,i);
			heapify(arr,0,i);
		}
	}
	//每添加一个元素都跟他的父节点比较,直到根或者不大于父节点
	public static void heapInsert(int[] arr, int index) {
		if (index==0){
			return;
		}
		while (index != 0 && arr[index] > arr[(index-1)/2]) {
				swap(arr, index, (index-1)/2);
				index = (index-1)/2;
		}
	}
	//该节点和子节点相比较
	public static void heapify(int[] arr, int index, int size) {
		int left=index*2+1;
		while(left<size) {
			int larger=0;
			if(left+1<size){
				larger=arr[left]>arr[left+1]?left:left+1;
			}else{
				larger=left;
			}
			larger=arr[larger]>arr[index]?larger:index;
			if(larger==index){
				break;
			}
			swap(arr, index, larger);
			index = larger;
			left=index*2+1;
		}
	}

	public static void swap(int[] arr, int i, int j) {
		int tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值