交换排序之快速排序 Java代码
概念:在序列上找到一个pivot(基准),然后通过一次快速排序后,就会找到pivot在序列的位置,此时该序列以pivot基准划分为一个比pivot小的元素都在pivot的左边,比pivot大的元素都在pivot的右边。然后在pivot的左边和右边分别使用快速排序,一直到low大于high时就完成了序列的排序。(其中用到了递归的思想)
算法思想:
第一步:找到一个pivot(基准),low和high(一般pivot选择序列的第一个元素,low为第一个元素,high为最后一个元素)
第二步:向前移动high的位置,直到找到一个比pivot小的元素
第三步:向后移动low的位置,直到找到一个比pivot大的元素
第四步:交换当前的两个元素
第五步:重复2,3,4步位置,直到low>high的时候停止。
例子:
排序序列为:5 7 5 8 6 9 1 4 3
因为high此时所在的元素为3小于了pivot的元素所以high不往前移动,接着就要把3这个元素与low位置的元素进行交换所以low位置的元素为3了(注意low位置的5元素已经给了pivot了所以不在怕覆盖了)。
因为low此时的元素为3小于了pivot的元素,所以会把low往后移动一位,此时low所在的元素是7大于了pivot了,所以需要与high交换元素,所以此时high所对应的元素为7。
再比较high所对应的元素与pivot的元素大小,发现high对应的元素大于了pivot所对应的元素,所以把high往前移动一位,此时high所对应的元素为4,再用4与pivot比较,发现high小于了pivot所以high不在往前移动了,接着就把4这个元素与与low位置的元素进行交换所以low位置的元素为4了(注意low位置目前是没有元素的,因为7元素在上面已经移动到了上衣给high位置了)。
此时low对应的元素为4,比较pivot的元素,发现小于pivot所对应的元素(5),所以low往后移动一位,所以此时low对应的元素为5,接着与pivot中的元素(5)比较(此时注意可以把等于认为小于pivot),所以再将low往后移动一位,此时low所对应的元素为1,再去和pivot比较,发现小于,再把low往后移一位,此时low所对应的元素为6,比较pivot,发现low的元素大于了pivot中的元素,所以把6元素交换到high此时的位置(就是先前4元素的位置);
high此时所对应的元素是6,比较pivot发现大于pivot(5),所以high往前移动一位,8和9都大于pivot所以high继续往前移动,最终low和high都移动到了原来是6元素这个位置,此时这个位置就是pivot的位置,此时就完成了一次快速排序。
就着递归调用在对5的左边和右边进行快速排序。
C代码:
java代码:
public class QuickSort { //快速排序的操作方法 public static int Partition(int[] arr,int low,int high){ int pivot = arr[low]; while (low<high){ while (low<high && pivot<=arr[high]){ high--; } arr[low] = arr[high]; while (low<high && pivot>=arr[low]){ low++; } arr[high] = arr[low]; } arr[low] = pivot; return low; } //快速排序 public static void quickSort(int[] arr,int low,int high) { //找到pivot的位置 int mid = 0; if (low<high){ mid = Partition(arr,low,high); //递归调用快速排序对基准位置的左右都进行快速排序 quickSort(arr,low,mid-1);//对基准左边进行快排 quickSort(arr,mid+1,high);//对基准右边进行快排 } } public static void main(String[] args) { int [] arr = {5,7,5,8,6,9,1,4,3}; quickSort(arr,0,arr.length-1); for (int i=0;i<arr.length;i++){ System.out.print(arr[i]+" "); } } }