快排
快 排
在学习前,首先要端正态度。在此我首先宣扬一下社会主义的核心价值观:富强、民主、文明、和谐,自由,平等、公正、法治,爱国、敬业、诚信、友善。
快排是对冒泡排序的一种改进。
例:
假设有一个int数组 A {6,0,7,9,2,5,1,8,3,4}
i从左侧开始指针,j是从右侧开始的指针
我们以index=A[0]=6 来做一个分界线 每次都与数组的第一个作对比
首先从j=9开始往左 直到i>=j时候或者找到一个比6小的数 这里A[9]=4 所以A[9]<6 我们就把A[9]和A[0]互换位置,这时候因为A[0]已经做过对比了 所以i往后移动 i++;
数组变成{4,0,7,9,2,5,1,8,3,6}
这时候到从i那里开始往又找 直到i>=j时候或者找到一个比6大的数,如果找到比6大的数 就和A[j](此时的A[j]=6)交换位置 因为A[j]已经和6做了对比 所以 j往前面移动 j--;
数组变成{4,0,6,9,2,5,1,8,3,7}
重复以上两部操作 直到i>=j;
这是数组为{4,0,3,1,2,5,6,8,9,7} 此时6的左边全部比6小 6的右边全部比6大
这时指针i 和 j都等于6
这里的代码如下
1 int l = low; 2 int h = high; 3 // int index = num[l]; 4 while (l<h){ 5 //从右边开始比较 6 while(l<h&&num[h]>num[l]) h--; 7 if(l<h){ 8 //交换位置 9 num[h] = num[h]+num[l]; 10 num[l]=num[h]-num[l]; 11 num[h]=num[h]-num[l]; 12 l++; 13 } 14 15 //从左边开始比较 16 while (l<h&&num[l]<num[h]) l++; 17 if (l<h){ 18 //交换位置 19 num[l] += num[h]; 20 num[h] =num[l]-num[h]; 21 num[l] =num[l]-num[h]; 22 h--; 23 }
此时数组分为两组{4,0,3,1,2,5},{8,9,7} 对这两组进行与上述的操作 知道最后开始i<=0 ; j>=数组长度-1;
整体代码如下
1 package org.demo; 2 3 public class Quick { 4 5 public void sort(int num[],int low,int high){ 6 int l = low; 7 int h = high; 8 // int index = num[l]; 9 while (l<h){ 10 //从右边开始比较 11 while(l<h&&num[h]>num[l]) h--; 12 if(l<h){ 13 //交换位置 14 num[h] = num[h]+num[l]; 15 num[l]=num[h]-num[l]; 16 num[h]=num[h]-num[l]; 17 l++; 18 } 19 20 //从左边开始比较 21 while (l<h&&num[l]<num[h]) l++; 22 if (l<h){ 23 //交换位置 24 num[l] += num[h]; 25 num[h] =num[l]-num[h]; 26 num[l] =num[l]-num[h]; 27 h--; 28 } 29 30 } 31 String s=""; 32 for(int n:num) { 33 s=s+n+" "; 34 } 35 System.out.println(s); 36 37 if (l>low) sort(num,low,h-1); //l和h都行 38 if (h<high) sort(num,h+1,high); //l和h都行 39 } 40 41 public static void main(String[] args) { 42 int num[]={6,0,7,9,2,5,1,8,3,4}; 43 Quick quick = new Quick(); 44 quick.sort(num,0,num.length-1); 45 String s=""; 46 for(int n:num) { 47 s=s+n+" "; 48 } 49 System.out.println(s); 50 } 51 }