趁找工作之际,着手对算法进行相关学习和整理,便于自己复习巩固,也以此来督促自己进行算法的研究学习。通过对算法的整理,一方面希望对于自己有所提高,另一方面,也希望提高自己的书面表达能力,文中有所不正确的地方,望批评指出,多谢。
对于算法学习,从简单到复杂。今天主要整理一下排序相关的算法。对于排序而言,一般最常考的就是归并排序和快速排序,接下来就针对这两种算法进行具体说明。
归并排序
思想:分治原则,合的时候进行排序,稳定排序。
需要用到两个函数,merge函数负责将有序的两个数组进行进行合并,mergeSort函数负责递归实现分组处理,Java代码如下:
public class MergeSort {
public static void main(String[] args) {
int a[]={3,2,5,4,7,9};
int tmp[]=new int[a.length];
new MergeSort().mergeSort(a, 0, a.length-1, tmp);
for (int i : a) {
System.out.println(i);
}
}
//将有序数组a[first..mid] a[mid+1,last]合并
void merge(int a[],int first,int mid,int last,int tmp[]){
int i=first;//前一个数组的开始下标
int j=mid+1;//后一个数组的开始下标
int m=mid;//前一个数组的最后下标
int n=last;//后一个数组的最后下标
int k=0;//存放临时数组到tmp
while(i<=m&&j<=n){
if(a[i]<=a[j]){
tmp[k++]=a[i];
i++;
}else {
tmp[k++]=a[j];
j++;
}
}
while(i<=m){
tmp[k++]=a[i++];
}
while(j<=n){
tmp[k++]=a[j++];
}
//复制tmp到a数组
for(i=0;i<k;i++){
a[first+i]=tmp[i];
}
}
void mergeSort(int a[],int first,int last,int tmp[]){
if(first<last){
int mid=(first+last)/2;
mergeSort(a, first, mid, tmp);//左边有序
mergeSort(a, mid+1, last, tmp);//右边有序
merge(a, first, mid, last, tmp);//合并
}
}
}
快速排序
思想:分治原则,分的时候进行排序,不稳定排序。
适合数据无序的情况,效率较高。
涉及到partition函数和quickSort函数。如下
package com.xpn.sort;
public class QuickSort {
public static void main(String[] args) {
int a[]={3,2,5,4,7,9};
new QuickSort().quickSort(a, 0, a.length-1);
for (int i : a) {
System.out.println(i);
}
}
//a[begin]为基准进行一次划分
public int partition(int[] a,int begin,int end){
int base=a[begin];
int low=begin;
int high=end;
while(low<high){
//从右到左进行扫描
while(low<high&&base<=a[high]){
high--;
}
a[low]=a[high];
//从左到右进行扫描
while(low<high&&base>=a[low]){
low++;
}
a[high]=a[low];
}
a[low]=base;
return low;//返回基准下标
}
void quickSort(int[] a,int low,int high){
if(low>=high)
return;
int index=partition(a, low, high);
quickSort(a, low, index-1);
quickSort(a, index+1, high);
}
}