方法和参数小编 用的是静态
参数一:需要快速排序的数组。
参数二:数组开始的位置。
参数三:数组结束的位置。
public static void Quick_Sort(int[] arr, int begin, int end){}
代码书写
小编采用了左右分排需要用到递归,这是设定了递归结束的条件,当递归传进来的参数开始指针大于结束指针则结束递归。
接受递归传进来的参数,并且初始化中轴,小编的中轴用的是每一次递归来的第一个元素。
这里需要注意的是中轴的值,中轴的的值是根据传进来的数组的第一个元素进行赋值的,但是如果第一个元素被修改的话,那么中轴也会改变。
//结束条件开头大指针于结尾指针
if(begin > end)
return;
//左侧为中轴ij左右数组最左最右指针
//中轴是根据arr数组的最左侧元素定义的中轴,如果被修改那么中轴也会被改变。
int tmp = arr[begin];
int i = begin;
int j = end;
根据中轴判断两边的元素是否符合我们想要的排序规则,小编这里先对右指针进行判断,如果符合规则右指针就会增加1,如果不符合规则,指针则会指向该元素并且结束循环。之后对左侧进行判断是否符合规则,不符合规则指向该元素。
左右两侧指针谁先指到元素就属于那一侧。
小编的左侧规则小于等于中轴,右侧规则大于等于中轴。
拿到左右两侧不符合规则的反过来在另一侧符合规则,进行元素交换,注意如果数组最左侧的元素被交换,那么中轴的元素也将会被改变。
//交换中轴两边的违规元素,这里面每循环一次中轴都会变
while(i != j){
while(arr[j] >= tmp && j > i)
j--;
while(arr[i] <= tmp && j > i)
i++;
if(j > i){
//这里修改了arr数组
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
中轴是用来分割数组分成左右两侧,且中轴只能有一个,也就是说左侧指针和右侧指针会指向同一个元素这个元素就是中轴改在的位置。
但是现在中轴元素在数组的第一个元素上也就是(tmp),需要和左右两侧指向的指针位置的元素进行交换。
arr[begin] = arr[j];
arr[i] = tmp;
将左右两侧的数组进行递归重复以上操作,中轴的位置已经是不需要递归了,因为左侧所有的元素比中轴小,中轴右侧的元素,比中轴大。
Quick_Sort(arr, begin, i-1);
Quick_Sort(arr, i+1, end);
以下是以上代码的结合:
void Quick_Sort(int[] arr, int begin, int end){
//结束条件开头大指针于结尾指针
if(begin > end)
return;
//左侧为中轴ij左右数组最左最右指针
//中轴是根据arr数组的最左侧元素定义的中轴,如果被修改那么中轴也会被
int tmp = arr[begin];
int i = begin;
int j = end;
//交换中轴两边的违规元素,这里面每循环一次中轴都会变
while(i != j){
while(arr[j] >= tmp && j > i)
j--;
while(arr[i] <= tmp && j > i)
i++;
if(j > i){
//这里修改了arr数组
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
//中轴是用来分割数组分成左右两侧,且中轴只能有一个,也就是说左侧指针和右侧指针会指向同一个元素这个元素就是中轴改在的位置。
//但是现在中轴元素在数组的第一个元素上,需要和左右两侧指向的指针位置的元素进行交换
arr[begin] = arr[j];
arr[i] = tmp;
//将左右两侧的数组进行递归重复以上操作,中轴的位置已经是不需要改变了,因为左侧所有的元素比中轴小,中轴右侧的元素,比中轴大。
Quick_Sort(arr, begin, i-1);
Quick_Sort(arr, i+1, end);
}