快速排序

1、排序原理

1)先从要排序的数组中取出一个基数(可以先把第一个数作为基数)然后用后面的数依次和基数比较,如果比基数大就放到基数的右边,反之放到左边;

2)把数组从这个基数所在的位置分成两个数组,左边一个,右边一个,把这两个数组分别按照第一步的方法进行排序;

3)一直不断的选出中间数,把数组不断的分成两部分直到只剩一个元素为止。

2、执行代码

a)赋值的方法
1) 先从数组的最高下标所对应的数和基数比较如果这个数大,就下标向左移动继续比较,如果这个数小就把这个数赋值给下标为0所对应的;

2)然后从低下标开始向上和基数比较,如果基数大,则下标向右移继续比较如果基数小,就把这个数赋值给刚才高下标多移动到的下标所对应的数,然后高下标继续左移比较;

3)就这样循环执行,直到低下标和高下标都指向通一个位置的时候结束;

4)然后把基数赋值给高下标,此时的高下标就是中间的下标,从此位置把数组分成两个部分继续这样的比较;

5) 通过不断的分割比较直到每一个部分的长度都为1 的时候结束;此时的结果就是排完序后的结果。

package sort;
import java.util.Arrays;

public class QuickSortTest {

 public static void main(String[] args) {
  int a[] = { 34, 432, 43, 32, 433, 123, 543, 1, 322, 341, 134, 30, 241,
    53, 41, 4124, 35 };
  if (a.length > 0) {

   quickSort(a, 0, a.length - 1);
  }
  System.out.println(Arrays.toString(a));
 }
 /*
  * 求出基数所在的下标
  */

 public static int findMiddle(int[] a, int low, int high) {

  int temp = a[low];
  while (low < high) {
   while (low < high && a[high] > temp) {
    high--;
   }
   a[low] = a[high];

   while (low < high && a[low] < temp) {
    low++;
   }
   a[high] = a[low];
  }
  a[high] = temp;
  return high;
 }
 /*
  * 用递归进行排序运算
  */

 public static void quickSort(int[] a, int low, int high) {
  if (low < high) {
   int middle = findMiddle(a, low, high);
   quickSort(a, 0, middle - 1);
   quickSort(a, middle + 1, high);
  }

 }
}



结果:

[1, 30, 32, 34, 35, 41, 43, 53, 123, 134, 241, 322, 341, 432, 433, 543, 4124]
b)交换位置的方法

1)先用高下标所对应的值和低下标所对应的值比较如果高下标对应的值大,就把高下标向左移动继续比较,反之就把高下标和低下标所对应的值交换位置;

2)然后用低下标所对应的值和高下标所对应的值比较如果低下标对应的值小,就把低下标向右移动继续比较,反之就把低下标和高下标所对应的值交换位置;

3)循环执行前两个步骤,直到高下标和低下标都指向同一个位置的时候结束;

4)此时高下标(低下标)所表示的下标就是中间值,从此位置把数组分成两个部分继续上面的比较;

5)通过不断的分割比较直到每一个部分的长度都为1 的时候结束;此时的结果就是排完序后的结果。

package sort;

import java.util.Arrays;

public class QuickSortTest {

 public static void main(String[] args) {
  int a[] = { 34, 432, 43, 32, 433, 123, 543, 1, 322, 341, 134, 30, 241,
    53, 41, 4124, 35 };
  if (a.length > 0) {

   quickSort(a, 0, a.length - 1);
  }
  System.out.println(Arrays.toString(a));
 }

 /*
  * 求出基数所在的下标
  */

 public static int findMiddle(int[] a, int low, int high) {

  while (low < high) {
   while (a[high] > a[low]) {
    high--;
   }
   if (low < high) {
    
    a[high] ^= a[low];
    a[low] ^= a[high];
    a[high] ^= a[low];
   }

   while (a[low] < a[high]) {
    low ++;
   }
   if (low < high) {
    a[low] ^= a[high];
    a[high] ^= a[low];
    a[low] ^= a[high];
   }
  }
  return high;
 }

 /*
  * 用递归进行排序运算
  */

 public static void quickSort(int[] a, int low, int high) {
  if (low < high) {
   int middle = findMiddle(a, low, high);
   quickSort(a, 0, middle - 1);
   quickSort(a, middle + 1, high);
  }

 }
}



结果:

[1, 30, 32, 34, 35, 41, 43, 53, 123, 134, 241, 322, 341, 432, 433, 543, 4124]

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值