您的位置:首页 > 其它

排序系列之快速排序和归并排序

2016-07-20 20:24 381 查看
快速排序的思想:
                           每次从数组中挑出一个数字作为基准,比它小的数放左边,比它大的数放右边
                           然后继续从左半部分和右半部分递归执行该操作,直到只剩一个数,返回

归并排序的思想:
                           将数组分为两个部分,左边一部分,右边一部分,一直递归分下去,直到只剩
                           一个数,返回,并进行两个有序数组合并。两个数组合并,就是从一个数组开
                          始,从第一个数开始和第二个数组的数比较,小的放入新数组,直到某一个数组
                          结束,然后将剩下那个数组的元素全部放入新数组。

快速排序的代码:

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
;

  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);

  

 }

 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;

 }

 private static void swap(int[] array, int i, int j) {

  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
;

  for(int i=0;i<
4000
;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);

  

 }

 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++;

  }

  

 }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: