快速排序java实现

//快速排序:
//基本思想:(分治)
//先从数组中取出一个数作为key值;
//将比这个数小的数全部放在它的左边,
//大于或等于它的数全部放在它的右边,
//对左右两个小数组重复上述步骤,直到各个区间只有1个数

//辅助理解:(挖坑填数)
//初始时:i=0;j=8;key=6
//由于已经将a[0]中的数保存到key中,可以理解成在数组a[0]上挖了个坑,可以将其他数据填充到这里来。
//从j开始向前查找一个比key小的数,当j=8,符合条件,a[0]=a[8];i++;
//将a[8]挖出再填上一个坑a[0]中。
//这样一个坑a[0]就被搞定了,单有形成了一个新坑a[8]。
//再找个数字来天a[8]这个坑,
//这次从i开始向后找一个大于key的数,当i=4,符合条件,a[8]=a[4];j--;将a[4]挖出填到上一个坑中。
//此时i=4;j=8;key=6;
//再重复上面的步骤,先从后向前找,再从前向后找
//从j开始向前找,当j=5时符合条件,将a[5]挖出填到上一个坑中,a[3]=a[5];i++;
//从i开始向后查找,当i=5时,由于i==j退出,此时i=j=5,而a[5]刚好是上次挖的坑,将key填入a[5]
//最终可以看出a[5]前面的数字都小于它,a[5]后面的数字都大于它,然后再对a[0]到a[4]、a[6]到a[8]这两个子区间重复上述步骤

//注意:key值的选取可以有多重形式,例如中间数或者随机数,分别对算法的复杂度产生不同的影响。
//平均时间复杂度:O(nlogn)

public class QuickSort {
public static void main(String[] args) {

int[] arr = new int[]{6,2,4,1,9,3,6,7,0};

System.out.println("排序前=====");

print(arr);

System.out.println("");

System.out.println("排序后=====");

quickSort(arr,0,arr.length-1);

print(arr);

}

public static void quickSort(int[] arr,int left,int right){

if(left>=right)

return ;

int i = left;

int j = right;

int key = arr[left];//选择第一个数作为key

while(i<j){

while(i<j && arr[j]>=key)//从右向左找

j--;

if(i<j){

arr[i] = arr[j];

i++;

}

while(i<j && arr[i]<key)//从左向右找

i++;

if(i<j){

arr[j] = arr[i];

j--;

}

}

//i=j

arr[i] = key;

quickSort(arr,left,i-1);//递归调用

quickSort(arr,i+1,right);//递归调用

}

public static void print(int[] arr){

for(int i=0; i<arr.length; i++){

System.out.print(arr[i]+",");

}

}

}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,913评论 0 2
  • 北上 窗外飞驰而过的看似胡杨,但又不知道是不是。只能看到,远方,似乎天际一线的样子。当然,偶尔也能看到一些村庄,以...
    泣夕阅读 338评论 0 0
  • 1. 过去的时光不回来 又到大家感叹一年即将结束的日子,有的人在衡量自己与年初定下的健身计划还差多少;有的人在总结...
    Brave_Kayla阅读 1,312评论 0 1
  • 今日七月十五,中元节! 下午结束121期NLP执行师课程, 赶往寺庙上香。 我内心满满的感动、感恩历代父母、感恩我...
    金灿灿的银杏叶阅读 246评论 0 2

友情链接更多精彩内容