/**
* @Function 数组从小到大排序
* @Author 挚爱
* @Time 2017年9月3日15:58:05
*/
public class QuicklySort {
public static void main(String[] args) {
int num[]=new int[]{45,87,89,37,55,44,15,76,82,45,2,1,133,2,8,0,66,14};
System.out.print("排序之前数组顺序为:");
print(num);
//排序
sort(num,0,num.length-1);//数组从0开始,所以说数组的长度-1才是数组最后一个值的索引
System.out.print("排序之前数组顺序为:");
print(num);
}
//排序(数组,数组的开始索引,数组的结束索引)
private static void sort(int[] num, int low, int high ) {
// TODO Auto-generated method stub
//在排序之前理清一下思路,一共有三种情况
//1、数组只有一个元素【还有不合乎情理的情况"开始索引>结束索引"(编程的严谨性,其实也可以不要)。】
//2、数组只有两个元素
//3、数组元素大于等于3个的情况下。
if(high<=low){//如果开始索引=结束索引(也就是讲这个数组只有一个元素),如果开始索引>结束索引不合逻辑。这两种情况都可以直接返回。
return;
}else if(high-low==1){//如果说数组只有两个元素的情况下,直接比较
if(num[low]>num[high]){//如果说大的在前面需要交换两个元素的值,把小的放前面。
swap(num,low,high);
}
}else{
//比较大小,需要有一个参考值【假设这个值为中间值,并且是数组的第一个元素】
//然后设置两个指针,第二个元素索引设为left指针,最后一个元素索引设为right指针,这两个指针可以根据需要右左移动。
int pivot=num[low];
int left=low+1;//左边的指针位置
int right=high;//右边的指针位置
//在left<right的情况下
//根据中间值,让左右两边进行比较
while(left<right){
/**
* 以left指针为出发点,向右比较
* 1、left指针批向的值如果大于中间值,直接跳出这个循环。
* 2、left指针指向的值如果小于等于中间值,left指针就向右移动(left++);
*/
while(left<=high){//当左指针没有到达最右边,并且符合条件的情况下,逐个比较
if(num[left]>pivot){//当左指针指向的值大于中间值时,退出
break;
}else{//当指针指向的值小于等于中间值时指针右移(left++)
left++;//【为什么相等的情况下需要移动?如果相等时不移动,下次同样相等还不移动】
}
}
/**
* 以right指针为出发点。向左比较
* 1、right指针指向的值如果小于中间值,退出
* 2、right指针指向的值如果大于等于中间值,左左移(right--)
*/
while(right>low){//这里为什么不能等于?因为low索引指向的元素假设成了中间值【如果可以等于,就等于自己和自己比较了】
if(num[right]<pivot){//当right指针指向的值小于中间值时,退出
break;
}else{//当指针指向的值大于等于中间值时,right指针左移(right--)
right--;//【为什么相等的情况下需要移动?如果相等时不移动,下次同样相等还不移动】
}
}
//当left指针和right指针,根据要求移动完成之后
//left<right,即:全部元素还没有查询完成,交换以left和right指针为索引的元素的值.然后继续下一轮循环查询
if(left<right){
swap(num,right,left);
}
//如果left>=right.程序会根据大前提【while(left<right)】条件退出循环
}
//程序运行到这里,已经是left>=right了,【并且此时,right左边的元素值都是小于中间值的了,而右边元素值也一定是大于中间值的了】
//此时应当把比较小的值放置到low的位置(也就是说,值小的放前面)
swap(num,low,right);
//此时left>=right了,下面就需要把数组分成两个部分分别查询了
sort(num,low,right);
sort(num,right+1,high);
}
}
//交换两个元素的值
private static void swap(int[] num, int i, int j) {
// TODO Auto-generated method stub
//设置一个可以存放这种元素的容器,作为元素交换时的临时存放点
int temp;
temp=num[i];
num[i]=num[j];
num[j]=temp;
}
//打印数组的方法
private static void print(int[] num) {
// TODO Auto-generated method stub
for(int i=0;i<num.length;i++){
System.out.print(num[i]+" ");
}
System.out.println();
}
}
* @Function 数组从小到大排序
* @Author 挚爱
* @Time 2017年9月3日15:58:05
*/
public class QuicklySort {
public static void main(String[] args) {
int num[]=new int[]{45,87,89,37,55,44,15,76,82,45,2,1,133,2,8,0,66,14};
System.out.print("排序之前数组顺序为:");
print(num);
//排序
sort(num,0,num.length-1);//数组从0开始,所以说数组的长度-1才是数组最后一个值的索引
System.out.print("排序之前数组顺序为:");
print(num);
}
//排序(数组,数组的开始索引,数组的结束索引)
private static void sort(int[] num, int low, int high ) {
// TODO Auto-generated method stub
//在排序之前理清一下思路,一共有三种情况
//1、数组只有一个元素【还有不合乎情理的情况"开始索引>结束索引"(编程的严谨性,其实也可以不要)。】
//2、数组只有两个元素
//3、数组元素大于等于3个的情况下。
if(high<=low){//如果开始索引=结束索引(也就是讲这个数组只有一个元素),如果开始索引>结束索引不合逻辑。这两种情况都可以直接返回。
return;
}else if(high-low==1){//如果说数组只有两个元素的情况下,直接比较
if(num[low]>num[high]){//如果说大的在前面需要交换两个元素的值,把小的放前面。
swap(num,low,high);
}
}else{
//比较大小,需要有一个参考值【假设这个值为中间值,并且是数组的第一个元素】
//然后设置两个指针,第二个元素索引设为left指针,最后一个元素索引设为right指针,这两个指针可以根据需要右左移动。
int pivot=num[low];
int left=low+1;//左边的指针位置
int right=high;//右边的指针位置
//在left<right的情况下
//根据中间值,让左右两边进行比较
while(left<right){
/**
* 以left指针为出发点,向右比较
* 1、left指针批向的值如果大于中间值,直接跳出这个循环。
* 2、left指针指向的值如果小于等于中间值,left指针就向右移动(left++);
*/
while(left<=high){//当左指针没有到达最右边,并且符合条件的情况下,逐个比较
if(num[left]>pivot){//当左指针指向的值大于中间值时,退出
break;
}else{//当指针指向的值小于等于中间值时指针右移(left++)
left++;//【为什么相等的情况下需要移动?如果相等时不移动,下次同样相等还不移动】
}
}
/**
* 以right指针为出发点。向左比较
* 1、right指针指向的值如果小于中间值,退出
* 2、right指针指向的值如果大于等于中间值,左左移(right--)
*/
while(right>low){//这里为什么不能等于?因为low索引指向的元素假设成了中间值【如果可以等于,就等于自己和自己比较了】
if(num[right]<pivot){//当right指针指向的值小于中间值时,退出
break;
}else{//当指针指向的值大于等于中间值时,right指针左移(right--)
right--;//【为什么相等的情况下需要移动?如果相等时不移动,下次同样相等还不移动】
}
}
//当left指针和right指针,根据要求移动完成之后
//left<right,即:全部元素还没有查询完成,交换以left和right指针为索引的元素的值.然后继续下一轮循环查询
if(left<right){
swap(num,right,left);
}
//如果left>=right.程序会根据大前提【while(left<right)】条件退出循环
}
//程序运行到这里,已经是left>=right了,【并且此时,right左边的元素值都是小于中间值的了,而右边元素值也一定是大于中间值的了】
//此时应当把比较小的值放置到low的位置(也就是说,值小的放前面)
swap(num,low,right);
//此时left>=right了,下面就需要把数组分成两个部分分别查询了
sort(num,low,right);
sort(num,right+1,high);
}
}
//交换两个元素的值
private static void swap(int[] num, int i, int j) {
// TODO Auto-generated method stub
//设置一个可以存放这种元素的容器,作为元素交换时的临时存放点
int temp;
temp=num[i];
num[i]=num[j];
num[j]=temp;
}
//打印数组的方法
private static void print(int[] num) {
// TODO Auto-generated method stub
for(int i=0;i<num.length;i++){
System.out.print(num[i]+" ");
}
System.out.println();
}
}