快速排序和三向切分的快速排序

前言

快速排序应该是应用最广泛的排序算法了,它实现简单,一般情况下比其他算法都要快。快速排序算法用到了递归的方法,它将数组的一个元素作为参照物,然后小于该元素的数据放到该元素的左边,大于该元素的数据放到该元素的右边,再以相同的方法对左边的数据和右边的数据进行操作,最后实现整个数组的有序

1,快速排序

下面的代码是普通的快速排序代码
代码:

import java.util.Scanner;

public class QuickSort {

	public static void Quick(int data[],int s,int t) {
		int i=s;
		int j=t;
		int temp;
		
		if(s<t) {
			temp=data[s];
			while(i!=j) {
				while(j>i && data[j]>temp) j--;
				data[i]=data[j];
				while(i<j && data[i]<temp) i++;
				data[j]=data[i];
			}
			data[i]=temp;
			Quick(data,s,i-1);
			Quick(data, i+1, t);
		}
	}
	
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		int num=s.nextInt();
		int data[] = new int[num];
		
		for(int i=0;i<num;i++) {
			data[i] = s.nextInt();
		}
		
		Quick(data,0,num-1);
		
		for(int i=0;i<num;i++) {
			System.out.print(data[i]+" ");
		}
	}
}

分析:
然后我在想该怎么说呢
。。。
算了,直接写一段排序过程更直接

  • 这里我们输入十个数,然后以第一个数也就是6为参照元素temp,i 指向6,j 指向5
  • 第一次while循环,从 j 开始,此时 j 指向的5是小于temp的,所以 j 不变,将 j 指向的值5赋值给 i 所在的位置,然后此时i指向的值就是5了,5是小于temp的,所以i++,此时 i 指向8,大于temp,所以 i 不变,把 i 指向的值8赋值给 j 所在的位置,这样第一次while循环就结束了,结果如第二行所示。
  • 后面还会有几个while循环,和上面的操作都是一样的,当 i==j 时,while循环结束,讲temp赋值给 i 或者 j 所在的位置,这样快速排序的第一步就完成了。
  • 此时 temp的左边都是小于他的数,对它们也进行上面的操作,于是就有了Quick(data,s,i-1); 同样的Quick(data, i+1, t);对右边的数排序
    快速排序和三向切分的快速排序_第1张图片

2,三向切分的快速排序

上面的快速排序确实很简单,但是有一个问题,那就是如果数据有很多重复的元素,那么上面的算法就会浪费很多时间对相同的元素进行排序,三向切分的快速排序是对快速排序的一种优化,适合处理含有重复元素的数据

	public static void Quick2(int data[],int s,int t) {
		int i=s;
		int j=t;
		int k=s+1;
		int temp=data[s];
		
		if(t>s) {
			while(k<=j) {
				//change(int data[],int a,int b)
				//将数组下标为a和b的元素互换
				if(data[k]<temp) change(data,i++,k++);
				else if(data[k]>temp) change(data,k,j--);
				else k++;
			}
			
			Quick2(data, s, i-1);
			Quick2(data, j+1, t);
		}
		
	}

你可能感兴趣的:(算法)