java吧 关注:1,266,004贴子:12,769,007
  • 8回复贴,共1

求解快速排序,急求各位大神回答!

只看楼主收藏回复

package paixu;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int n[] = new int[10];
int m;
for(int i=0;i<10;i++)
{
m=(int)(Math.random()*100);
n[i]=m;
}
System.out.println(Arrays.toString(n));
quickSort(n, 0, n.length-1);
System.out.println(Arrays.toString(n));
}
/*先按照数组为数据原型写出算法,再写出扩展性算法。数组{49,38,65,97,76,13,27}
* */
public static void quickSort(int[]n ,int left,int right){
int pivot;
if (left < right) {
//pivot作为枢轴,较之小的元素在左,较之大的元素在右
pivot = partition(n, left, right);
//对左右数组递归调用快速排序,直到顺序完全正确
quickSort(n, left, pivot - 1);
quickSort(n, pivot + 1, right);
}
}
public static int partition(int[]n ,int left,int right){
int pivotkey = n[left];
//枢轴选定后永远不变,最终在中间,前小后大
while (left < right) {
while (left < right && n[right] >= pivotkey) --right;
//将比枢轴小的元素移到低端,此时right位相当于空,等待低位比pivotkey大的数补上
n[left] = n[right];
while (left < right && n[left] <= pivotkey) ++left;
//将比枢轴大的元素移到高端,此时left位相当于空,等待高位比pivotkey小的数补上
n[right] = n[left];
}
//当left == right,完成一趟快速排序,此时left位相当于空,等待pivotkey补上
n[left] = pivotkey;
return left;
}
}
——————————————————————————————————
while (left < right) {
while (left < right && n[right] >= pivotkey) --right;
//将比枢轴小的元素移到低端,此时right位相当于空,等待低位比pivotkey大的数补上
n[left] = n[right];
while (left < right && n[left] <= pivotkey) ++left;
//将比枢轴大的元素移到高端,此时left位相当于空,等待高位比pivotkey小的数补上
n[right] = n[left];
}
我想问为什么这里n[right]和n[left]相当于空是什么意思?


IP属地:广东1楼2014-12-24 12:04回复
    求解求解求解~,谢谢大家


    IP属地:广东2楼2014-12-24 12:05
    回复
      2025-06-24 19:58:07
      广告
      你这个是对的吗


      IP属地:四川3楼2014-12-24 12:25
      回复
        while (left < right && n[right] >= pivotkey) --right;
        //将比枢轴小的元素移到低端,此时right位相当于空,等待低位比pivotkey大的数补上
        n[left] = n[right];
        因为n[right]值赋给n[left]了,就有两个一样的值,所以n[right]值已经没用了,当right左边有值>中间值pivotkey,就赋给n[right],就是下面的代码
        while (left < right && n[left] <= pivotkey) ++left;
        //将比枢轴大的元素移到高端,此时left位相当于空,等待高位比pivotkey小的数补上
        n[right] = n[left];
        }
        就像数组{49,38,65,97,76,13,27} 执行第一个while后变成{27,38,65,97,76,13,27}执行第二个while后变成{27,38,65,97,76,13,65} 循环完执行 n[left] = pivotkey;数组变成 {27,38,49,97,76,13,65}


        IP属地:四川4楼2014-12-24 12:44
        收起回复
          public class QuickSort{
          public static void main(String args[]){
          int array[]={1,3,5,7,9,2,4,6,8,10,18,25,63,74,0};
          quickSort(0,array.length-1,array);
          for(int i=0;i<array.length;i++){
          System.out.print(array[i]+" " );
          }
          }
          static void quickSort(int left,int right,int arr[]){
          int l=left;
          int r=right;
          int pivot=arr[(left+right)/2];
          int temp=0;
          while(l<r){
          while(arr[l]<pivot)l++;
          while(arr[r]>pivot)r--;
          if(l>=r)break;
          temp=arr[r];
          arr[r]=arr[l];
          arr[l]=temp;
          if(arr[l]==pivot){
          l++;
          }
          if(arr[r]==pivot){
          r--;
          }
          }
          if(l==r){
          l++;
          r--;
          }
          if(l<right)quickSort( l,right, arr);
          if(left<r)quickSort( left,r, arr);
          }
          }
          这种就要好理解一些,将左边比中间值大的与有边比中间值小的交换


          IP属地:四川6楼2014-12-24 13:30
          收起回复