算法导论:快速排序

  快速排序的原理:

1.选取一个元素q,术语叫做主元  

 2.循环数组a,将数组分割成 a[p...q-1]  (小于主元部分) 和 a[q+1....r](大于主元部分)两部分,中间位置即选取主元q排序后的的位置。

 3.循环迭代被分隔的数组即a[p...q-1] 和 a[q+1...r] 继续重复1,2步骤,这样数组就变成一个有序的数组。

          伪代码如下:

            

    

其中partition的过程如下:

  

             如图所示,其中浅阴影的部分是值不大于a[r]的值,深阴影的部分是大于a[r]的值,无阴影的元素是尚未进行排序的元素,r元素为主元。

    a)所有元素都未进行排序。

            b)数值2为小于主元的元素,需要进行交换,此刻i与j的值相同,只能与自己交换。

    c)-d)都大于主元,被划入大于主元元素的那一部分中。

    e)1为小于主元的元素,与8交换,并且小于主元的部分下标增加。

             f)同上

             g)-h)较大元素部分增加,并且循环结束。

              i)主元被交换到两个数组的中间部分,至此完成了一次排序,后续再去各自递归调用被分好组的两部分,即大于主元的小于主元的数组再重复上述过程,

                这样数组元素就进行了排序。


下面是java代码实现过程

public class QuickSort {
	/**
	 * 快速排序的原理:
	 * 1.选取一个元素q,术语叫做主元
	 * 2.循环数组a,将数组分割成 a[p...q-1] 和 a[q+1....r]两部分,中间位置即选取主元q排序后的的位置。
	 * 3.循环迭代被分隔的数组即a[p...q-1] 和 a[q+1...r] 继续重复1,2步骤,这样数组就变成一个有序的数组。
	 *  
	 */
	
	public void quickSort(int [] a,int p ,int r ){
		if(p<r){
			//找出主元排序后在数组中的下标
			int q = partition(a,p,r);
			//分割后继续排序
			quickSort(a,p,q-1);
			quickSort(a,q+1,r);
		}
	}
	
	private int partition(int [] a,int p ,int r){
		//选取主元,默认为最后一个元素
		int x = a[r];
		int i=p-1;
		for(int j=p;j<r;j++){
			if(a[j]<x){
				i++;
				
				int temp = a[j];
				a[j] = a[i];
				a[i] = temp;
			}
		}
		int t = a[i+1];
		a[i+1] = a[r];
		a[r] = t;
		return i+1;
	}
	
	public static void main(String[] args) {
		QuickSort sort = new QuickSort();
		int []  a = {2,8,6,1,3,10,4};
		sort.quickSort(a, 0, a.length-1);
		for(int i=0;i<a.length;i++){
			System.out.println(a[i]);
		}
	}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章