归并在学数组合并的时候学了一次,链表合并时又学了一次,在加上数据结构中学了一次,算法中一次。OMG,排序中还要学一次……在记不住就没天理人性了啊。
public class MergeSort {
private int[] paraL;
private int[] paraSL;//排序好的list
public MergeSort(){}
public void show(){
paraL = paraSL;
System.out.println("排序后的记录为:");
for(int para:paraL){
System.out.print(para+" ");
}
System.out.println();
}
public void merge(int s,int m,int e){//将paraL中的s至m,m+1至e链表合并到paraSL
int ss = s;
int i = s;
int mm = m+1;
/*s是s至m的指针,mm是m至e的指针,ss是paraSL的指针*/
while(s <= m && mm <= e){//s和e处都能取到值
if(paraL[s]<paraL[mm]){//将小的插入到paraSL
paraSL[ss++] = paraL[s++];
}else{
paraSL[ss++] = paraL[mm++];
}
}
while(s <= m){//将s至m段剩余部分插入paraSL
paraSL[ss++] = paraL[s++];
}
while(mm <= e){//将m+1至e段剩余部分插入paraSL
paraSL[ss++] = paraL[mm++];
}
/*<span style="color:#ff0000;">在副本里排好序之后需要拷回原数组,这一点最为重要</span>*/
for(;i <= e ; i++){
paraL[i] = paraSL[i];
}
}
public void mSort(int s,int e){
if(s==e){
paraSL[s] = paraL[s];
}else{
int m = (s+e)/2;
mSort(s,m);
mSort(m+1,e);
merge(s,m,e);
}
}
public static void main(String[] args){
int[] paraL = {9,8,7,6,5,4,3,2,1};
MergeSort ms = new MergeSort();
ms.setParaL(paraL);
ms.mSort(0,paraL.length-1);
ms.show();
}
public int[] getParaL() {
return paraL;
}
public void setParaL(int[] paraL) {
this.paraL = paraL;
paraSL = new int[this.paraL.length];
}
}
20160803再次实现
/**
* ClassName: MergeSort
* @Description: 归并排序:分治法的应用,把链表分成两部分,两部分分别递归进行排序,然后将两部分合并。
* @author Panyk
* @date 2016年8月3日
*/
public class MergeSort {
public int[] data;
private int[] tempD;
public MergeSort(int[] data) {
this.data = data;
tempD = new int[data.length];
}
/**
* @Description:对start至end的元素进行排序,包括start和end
* @param @param start
* @param @param end
* @return void
* @throws
* @author Panyk
* @date 2016年8月3日
*/
public void sort(int start, int end){
if(start >= end){
return;
}
int middle = (start + end)/2;
sort(start, middle);
sort(middle + 1, end);//因为前面已经处理middle了,所以这里需要从middle+1开始处理
merge(start, middle, end);//将上面已经排好序的两段进行合并
show();
}
/**
* @Description:合并逻辑上的两个链表
* @param @param start
* @param @param middle
* @param @param end
* @return void
* @throws
* @author Panyk
* @date 2016年8月3日
*/
private void merge(int start, int middle, int end){
int i = start;
int j = middle+1;
int k = start;
while(i<=middle && j<=end){
if(data[i]<data[j]){
tempD[k++] = data[i++];
}else{
tempD[k++] = data[j++];
}
}
while(i<=middle){
tempD[k++] = data[i++];
}
while(j<=end){
tempD[k++] = data[j++];
}
i = start;
while(i <= end){//把合并后的数据拷贝到原始数组
data[i] = tempD[i];
i++;
}
}
private void show(){
for(int temp: data){
System.out.print(" " + temp);
}
System.out.println();
}
public static void main(String[] args) {
// int[] data = new int[]{1, 3, 5, 2, 4, 4, 1, 2};
int[] data = {9,8,7,6,5,4,3,2,1};
MergeSort qs = new MergeSort(data);
qs.sort(0, data.length-1);
}
}