算法导论:快速排序

  快速排序的原理:

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

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

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

          伪代码如下:

           算法导论:快速排序_第1张图片 

    

其中partition的过程如下:

  算法导论:快速排序_第2张图片

             如图所示,其中浅阴影的部分是值不大于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		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			System.out.println(a[i]);
		}
	}

}


你可能感兴趣的:(算法,数据结构)