常见的排序算法——归并排序
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] + " ");
}
}
}
以上是关于常见的排序算法——归并排序的主要内容,如果未能解决你的问题,请参考以下文章