Java 快速排序

//str为需要排序的数组,l为str的起始位置,r为str的长度-1,m为一个默认特殊点
public static void quick(int[] str,int l,int r,int m) {
                //如果数组为空,则直接返回
		if(str==null) return;
                //如何数组长度为1,则不需要排序,直接返回
		if(str.length==1) return;
                //递归的出口
		if(r-l<1) return;
                //调用findMiddle函数,使得数组str[m]左边部分的每一个数比这个数小,右边部分的每一个数比这个数大
		m=findMiddle(str,l,r,m);
                //递归左边部分
		quick(str,l,m-1,l);
                //递归右边部分
		quick(str,m+1,r,m+1);
	}
//返回一个值m,使得数组str[m]左边部分的每一个数比这个数小,右边部分的每一个数比这个数大
private static int findMiddle(int[] str,int l,int r,int m) {
                //递归出口
		if((r-l)<1) return m;
                //从后往前遍历,如果发现str[m]大于str[r]则交换两者,则str[m]右边的数都比str[m] 大
		for(;r>=m;r--) {
			if(str[m]>str[r]){
				swap(str,m,r);
				m=r;//1
				break;
			}
		}
              //从前往后遍历,如果发现str[m]小于str[r]则交换两者,则str[m]左边边的数都比str[m] 小
		for(;l<=m;l++) {
			if(str[m]<=str[l]){
				swap(str,m,l);
				m=l;//2
				break;
			}
		}
              //因为此时  l 不一定等于  r (此时 l< r或者l==r)  索引 l 与 索引 r 之间有一无序数据  所以需要对上面的两部分再执行一遍,因此需要递归.
              //当r-l<1,函数会返回一个值m,说明此时的m使得数组str[m]左边部分的每一个数比这个数小,右边部分的每一个数比这个数大
		return findMiddle(str,l,r,m);
	}
//交换函数
public static void swap(int[] data,int index1,int index2) {
		int s = data[index1];
		data[index1]=data[index2];
		data[index2]=s;
	}

posted @ 2022-04-03 23:03  随心写  阅读(19)  评论(0)    收藏  举报