常见的排序算法——归并排序

Posted sdx-bk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常见的排序算法——归并排序相关的知识,希望对你有一定的参考价值。

归并算法:

先来个图解^v^:

 技术图片

 

 

归并排序的思想就是:如果一个数组无序,那么 ,将这个数组一分为二,
如果一分为二的数组还是无序的,那么就继续往下分数组,直到分出来的数组有序
(一般情况下,被分的数组只剩两个数,那么这两个数一定有序)。

 

这图是我手画的,是归并的数组分解和归并。

 

 

 

我先哪一个前后已经排好序的数组来举个例子。 

 

//归并算法
/*
归并算法最主要的就是递归调用,(即:在方法的自身调用自身)
写一个简单的递归调用的伪代码:
public static void main(String args[]){
System.out.printin(f(10));
}

static long f(int n){
if(n<1)return -1;
if(n==1)return 1;

return n+f(n-1);//递归调用了自身方法。
}

归并排序的思想就是:如果一个数组无序,那么 ,将这个数组一分为二,
如果一分为二的数组还是无序的,那么就继续往下分数组,直到分出来的数组有序
(一般情况下,被分的数组只剩两个数,那么这两个数一定有序)

*/
package sdx;

public class Main10 {

public static void main(String[] args) {
//前提是两个子数组已经排好顺序了
int a[] = {1,4,7,8,3,6,9};
sort(a);
//print(a);
}

static void sort(int a[]) {
//将数组从中间断开
int mid = a.length/2;
//分配辅助空间
int temp[]=new int[a.length];

//i=0指在前半个数组的第一个位置1
//j=min+1指在后半截数组的第一个位置上3
//k=0指在temp的第一个位置上

int i=0,j=mid+1,k=0;

while(i<=mid&&j<a.length){
// if(a[i]<=a[j]){
// temp[k]=a[i];
// i++;
// k++;
// }else{
// temp[k]=a[j];
// j++;
// k++;
// }

if(a[i]<=a[j]){
temp[k++]=a[i++];
}else{
temp[k++]=a[j++];
}


}
while(i<=mid) temp[k++]=a[i++];
while(j<a.length) temp[k++]=a[j++];

print(temp);


}

static void swap(int a[], int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}

static void print(int arr[]) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}

以上是关于常见的排序算法——归并排序的主要内容,如果未能解决你的问题,请参考以下文章

常见排序算法-归并排序

常见的排序算法:归并排序

常见排序算法的实现(归并排序快速排序堆排序选择排序插入排序希尔排序)

十种常见排序算法

常见的排序算法——归并排序

常见排序算法详解(冒泡选择插入快速希尔归并)