vlambda博客
学习文章列表

【每日算法】快速排序

今日题目:以中间数为基准,对某数列进行快速排序。


点题:快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

该方法的基本思想是:

  • 1.先从数列中取出一个数作为基准数。
  • 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
  • 3.再对左右区间重复第二步,直到各区间只有一个数。  

大家可以先自行思考,并自己使用算法实现


以下为具体程序(Java):

import java.util.ArrayList;import java.util.Arrays;import java.util.LinkedList;
public class Quicksort { public static void main(String[] args) { int arr[]=new int[]{15,52,0,-3,222,36,-18,90,-5556,7}; System.out.println("排序前的数组是:"+Arrays.toString(arr)); System.out.println("***************"); Qs(arr,0,arr.length-1); System.out.println("排序后的数组是:"+Arrays.toString(arr));
} public static void Qs(int []arr,int left,int right){ int l=left; //左索引 int r=right; //右索引 int pivot=arr[(l+r)/2]; int temp=0; //临时变量 //while循环的目的是每一次都把比pivot小的放他左边,比pivot大的放他右边 while (l<r){ while (arr[l]<pivot){ l+=1; } while ((arr[r]>pivot)){ r-=1; } //如果是这样,说明pivot的左右两的值,已经按照左边全是小等于pivot、右边全是大等于pivot值 if(l>=r){ break;            } //交换 temp=arr[l]; arr[l]=arr[r];            arr[r]=temp;            //如果交换完后,发现这个arr【l】==pivot值相等 r-- 前移一下 if(arr[l]==pivot){ r-=1;            } //如果交换完后,发现这个arr【r】==pivot值相等 l++ 后移一下 if(arr[r]==pivot){ l+=1; } } //如果l==r,必须l++ r-- 否则为出现栈溢出 if(l==r){ l+=1; r-=1; } //向左递归 if (left<r) { Qs(arr,left,r);        } //向右递归 if(right>l){ Qs(arr,l,right);        }    }}