package com.joker.suanfa;
public class QuickLySort {
/**快速排序 如果是按照从小到大进行排序,那么最后的结果应该是大的数字在右边,小的数字在左边。
* 实质步骤:1 选取一个基准值(如第一位source[0],然后从右往左(j=source的长度,j--)开始查找,发现小于基准的值之后,就停下来,定位到这一点
* 2 从左到右开始循环(i=0,i<j i<j是为了保证同一段数据只循环一次)查找发现大于基准值之后就停下来
* 此时有两种可能,一个是i=j,一个是i<j,
* i=j,表示这一段数据已经遍历完了,那么,交换基准值和i当前的位置的值就完成了这一段数据的排序,如:int[]{3,1,2,5,4}
* i<j,表示这一段数据还没遍历完,那么此时,需要交换i和j的值,并继续排序,直到i和j相同(碰头)如 : int[]{3,1,2,4,5,2,4};
* @param source 需排序的数据
* @param left 左边开始查找位
* @param right 右边开始查找位
*/
public static void quick_sort(int source[], int left, int right)
{
if(left>right){
return;
}
int base = source[left];
int i =left;
int j = right;
while(i!=j){
while(source[j]>=base&&i<j){
j--;
}
while(source[i]<=base&&i<j){
i++;
}
if(i<j){
int temp =source[i];
source[i]=source[j];
source[j]=temp;
}
}
//碰头的时候,表示整个数据已经遍历完了,这个时候将碰头的值和基准值(第一位)交换,则可以得到由基准值一分为二的数组,基准值前面的数小于基准值
//基准值后面的数,大于基准值
source[left] =source[i];
source[i]=base;
//i的位置上的值就是基准值,已经排好序,故只需要处理余下的两个部分
quick_sort(source, left,i-1);
quick_sort(source, i+1, right);
}
public static void main(String[] args) {
int s [] = new int[]{3,1,2,5,4};
// int s [] = new int[]{3,1,2,4,5,2,4};
quick_sort(s,0,s.length-1);
for(int i=0;i<s.length;i++){
System.out.println(s[i]);
}
}
}
public class QuickLySort {
/**快速排序 如果是按照从小到大进行排序,那么最后的结果应该是大的数字在右边,小的数字在左边。
* 实质步骤:1 选取一个基准值(如第一位source[0],然后从右往左(j=source的长度,j--)开始查找,发现小于基准的值之后,就停下来,定位到这一点
* 2 从左到右开始循环(i=0,i<j i<j是为了保证同一段数据只循环一次)查找发现大于基准值之后就停下来
* 此时有两种可能,一个是i=j,一个是i<j,
* i=j,表示这一段数据已经遍历完了,那么,交换基准值和i当前的位置的值就完成了这一段数据的排序,如:int[]{3,1,2,5,4}
* i<j,表示这一段数据还没遍历完,那么此时,需要交换i和j的值,并继续排序,直到i和j相同(碰头)如 : int[]{3,1,2,4,5,2,4};
* @param source 需排序的数据
* @param left 左边开始查找位
* @param right 右边开始查找位
*/
public static void quick_sort(int source[], int left, int right)
{
if(left>right){
return;
}
int base = source[left];
int i =left;
int j = right;
while(i!=j){
while(source[j]>=base&&i<j){
j--;
}
while(source[i]<=base&&i<j){
i++;
}
if(i<j){
int temp =source[i];
source[i]=source[j];
source[j]=temp;
}
}
//碰头的时候,表示整个数据已经遍历完了,这个时候将碰头的值和基准值(第一位)交换,则可以得到由基准值一分为二的数组,基准值前面的数小于基准值
//基准值后面的数,大于基准值
source[left] =source[i];
source[i]=base;
//i的位置上的值就是基准值,已经排好序,故只需要处理余下的两个部分
quick_sort(source, left,i-1);
quick_sort(source, i+1, right);
}
public static void main(String[] args) {
int s [] = new int[]{3,1,2,5,4};
// int s [] = new int[]{3,1,2,4,5,2,4};
quick_sort(s,0,s.length-1);
for(int i=0;i<s.length;i++){
System.out.println(s[i]);
}
}
}