快速排序的思想:
每次从数组中挑出一个数字作为基准,比它小的数放左边,比它大的数放右边
然后继续从左半部分和右半部分递归执行该操作,直到只剩一个数,返回
归并排序的思想:
将数组分为两个部分,左边一部分,右边一部分,一直递归分下去,直到只剩
一个数,返回,并进行两个有序数组合并。两个数组合并,就是从一个数组开
始,从第一个数开始和第二个数组的数比较,小的放入新数组,直到某一个数组
结束,然后将剩下那个数组的元素全部放入新数组。
快速排序的代码:
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String line=sc.nextLine();
String[] str=line.split(" ");
int n=str.length;
int[] array=new int[n];
for(int i=0;i<n;i++){
array[i]=Integer.parseInt(str[i]);
}
quickSort(array,0,n-1);
for(int j:array){
System.out.print(j+" ");
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String line=sc.nextLine();
String[] str=line.split(" ");
int n=str.length;
int[] array=new int[n];
for(int i=0;i<n;i++){
array[i]=Integer.parseInt(str[i]);
}
quickSort(array,0,n-1);
for(int j:array){
System.out.print(j+" ");
}
}
private static void quickSort(int[] array, int start, int end) {
if(start==end)return;
int index=partition(array,start,end);
if(index>start)quickSort(array,start,index);
if(index<end)quickSort(array,index+1,end);
}
if(start==end)return;
int index=partition(array,start,end);
if(index>start)quickSort(array,start,index);
if(index<end)quickSort(array,index+1,end);
}
private static int partition(int[] array, int start, int end) {
Random random=new Random();
int select=random.nextInt(end-start+1)+start;
swap(array,select,end);
int small=start-1;
for(int index=start;index<end;index++){
if(array[index]<array[end]){
small++;
if(small!=index)
swap(array,small,index);
}
}
small++;
swap(array,small,end);
return small;
}
Random random=new Random();
int select=random.nextInt(end-start+1)+start;
swap(array,select,end);
int small=start-1;
for(int index=start;index<end;index++){
if(array[index]<array[end]){
small++;
if(small!=index)
swap(array,small,index);
}
}
small++;
swap(array,small,end);
return small;
}
private static void swap(int[] array, int i, int j) {
int temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
int temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
归并排序的代码:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String line=sc.nextLine();
String[] str=line.split(" ");
int n=str.length;
int[] array=new int[n];
for(int i=0;i<n;i++){
array[i]=Integer.parseInt(str[i]);
}
mergeSort(array,0,n-1);
for(int j:array){
System.out.print(j+" ");
}
}
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String line=sc.nextLine();
String[] str=line.split(" ");
int n=str.length;
int[] array=new int[n];
for(int i=0;i<n;i++){
array[i]=Integer.parseInt(str[i]);
}
mergeSort(array,0,n-1);
for(int j:array){
System.out.print(j+" ");
}
}
private static void mergeSort(int[] array, int start, int end) {
if(start==end)return;
int index=(start+end)/2;
mergeSort(array,start,index);
mergeSort(array,index+1,end);
merge(array,start,index+1,end);
}
if(start==end)return;
int index=(start+end)/2;
mergeSort(array,start,index);
mergeSort(array,index+1,end);
merge(array,start,index+1,end);
}
private static void merge(int[] array, int begin1, int begin2, int end) {
int[] sort=new int[end-begin1+1];
int pointer1=begin1;
int pointer2=begin2;
int end1=begin2-1;
int k=0;
while(pointer1!=end1+1&&pointer2!=end+1){
if(array[pointer1]<array[pointer2]){
sort[k]=array[pointer1];
pointer1++;
}else{
sort[k]=array[pointer2];
pointer2++;
}
k++;
}
if(pointer1==end1+1){
while(pointer2!=end+1){
sort[k]=array[pointer2];
pointer2++;
k++;
}
}else{
while(pointer1!=end1+1){
sort[k]=array[pointer1];
pointer1++;
k++;
}
}
k=0;
for(int i=begin1;i<=end;i++){
array[i]=sort[k];
k++;
}
}
}
int[] sort=new int[end-begin1+1];
int pointer1=begin1;
int pointer2=begin2;
int end1=begin2-1;
int k=0;
while(pointer1!=end1+1&&pointer2!=end+1){
if(array[pointer1]<array[pointer2]){
sort[k]=array[pointer1];
pointer1++;
}else{
sort[k]=array[pointer2];
pointer2++;
}
k++;
}
if(pointer1==end1+1){
while(pointer2!=end+1){
sort[k]=array[pointer2];
pointer2++;
k++;
}
}else{
while(pointer1!=end1+1){
sort[k]=array[pointer1];
pointer1++;
k++;
}
}
k=0;
for(int i=begin1;i<=end;i++){
array[i]=sort[k];
k++;
}
}
}