本文已参与「新人创作礼」活动,一起开启掘金创作之路 持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情 最近初学java,写文来记录一下java的学习过程,今天用java实现了快速排序。在此重新回顾一下快速排序的原理;
<快速排序>
快速排序先要指定一个排序的区间,在这个区间中,找到一个基准数,我们一般指定这个基准数为数组最中间的数,它的下标是 mid=(L+R)/2,对于这个区间,我们希望在arr[mid]左边的数都要比arr[mid]小,右边的数都要比它大。如此,这个区间就排序好了。
那我们具体要如何操作呢?
我们设置一个变量i指向数组最左端,变量j指向数组最右端,然后让i从左往右,找到第一个比arr[mid]大的数(因为我们的区间左半边是要比arr[mid]小的,如果有大的就不符合升序了),同理:让“指针”j从右往左寻找第一个比arr[mid]小的数。然后在两个过程都执行完了之后,交换arr[i]和 arr[j]。直到“指针”i和j相遇为止;
上文的指针不是指C语言或者C++中存放地址的指针,而是双指针函数中的指针
public class Main {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
int n=cin.nextInt();
int[] arr=new int[n+1];
for(int i=1;i<=n;i++)arr[i]=cin.nextInt();
quick_sort(1,n,arr);
for(int i=1;i<=n;i++)
System.out.printf("%d ",arr[i]);
}
public static void quick_sort(int l,int r,int arr[]){
int i=l,j=r;
int mid=arr[(l+r)/2];
do{
while(arr[i]<mid)i++;
while(arr[j]>mid)j--;
if(i<=j) {
// arr[i]=arr[i]^arr[j];
// arr[j]=arr[i]^arr[j];
// arr[i]=arr[i]^arr[j];
swap(arr,i,j);
i++;j--;
}
}while(i<=j);
if(l<j)quick_sort(l,j,arr);
if(i<r)quick_sort(i,r,arr);
}
public static void swap(int arr[],int id1,int id2){
int temp=arr[id1];
arr[id1]=arr[id2];
arr[id2]=temp;
}
}