快速排序
快速排序与归并排序一样,也是基于分治的思想,不同处在于
①划分问题的方法
在快速排序中,每次划分以第一个数字为基准pivot,将数组划分为两部分,左半部分的值全部<=pivot,右半部分的值全部>=pivot;
在归并排序中,每次划分把数组划分为元素个数尽量相等的两半。
②合并问题的方法
在快速排序中,划分问题的过程中,已经保证了部分顺序,不用在最后合并问题;
在归并排序中,还需要在最后合并问题
③时间复杂度
快速排序的时间复杂度平均是O(n logn),最坏是O(n^2);归并排序最差、平均、最好都是O(n logn)。
在java实现中, Arrays.sort()对于基本类型数据使用快速排序法,对象数组使用堆排序。
快速排序代码:
import java.util.Scanner;
public class Main {
public static int partition(int[] arr,int i,int j){
int pivot=arr[i];
while(i<j){
while(i<j&&arr[j]>=pivot)
j--;
if(i<j)
arr[i++]=arr[j];
while(i<j&&arr[i]<=pivot)
i++;
if(i<j)
arr[j--]=arr[i];
}
arr[i]=pivot;
return i;
}
public static void quickSort(int[] arr,int low,int high){
if(low<high){
int pivot=partition(arr,low,high);
quickSort(arr,low,pivot-1);
quickSort(arr,pivot+1,high);
}
}
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext())
{
int n=scanner.nextInt();
int[] arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=scanner.nextInt();
}
quickSort(arr,0,n-1);
StringBuffer str=new StringBuffer();
for(int i:arr){
str.append(i+" ");
}
System.out.println(str.substring(0, str.length()-1));
}
scanner.close();
}
}
数组中超过一半的数字
数组中有一个数字出现的次数超过数组长度的一般,请找出这个数字。
样例输入:
9
1 2 3 2 2 2 5 4 2
样例输出:
2
有多种解法,下面给出基于Partition函数的方法
import java.util.Scanner;
public class Main {
public static int partition(int[] arr,int i,int j){
int pivot=arr[i];
while(i<j){
while(i<j&&arr[j]>=pivot)
j--;
if(i<j)
arr[i++]=arr[j];
while(i<j&&arr[i]<=pivot)
i++;
if(i<j)
arr[j--]=arr[i];
}
arr[i]=pivot;
return i;
}
public static int moreThanHalf(int[] arr,int low,int high){
int middle=(low+high)/2;
int pivot=partition(arr,low,high);
if(pivot!=middle){
if(pivot<middle){
low=pivot+1;
pivot=partition(arr,low,high);
}
else{
high=pivot-1;
pivot=partition(arr,low,high);
}
}
return arr[middle];
}
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext())
{
int n=scanner.nextInt();
int[] arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=scanner.nextInt();
}
int res=moreThanHalf(arr, 0, n-1);
System.out.println(res);
}
scanner.close();
}
}