java(Merge) 实现归并排序,快速排序

public class sort {
public static void merge(int[] src1,  int start1,  int len1,  int[] src2,  int start2,  int len2, int[] dest,  int start ) {
int i = start1;
int j = start2;
int k = 0;
int[] tmp = new int[len1 + len2];
while (i < start1 + len1 && j < start2 + len2) {
if (src1[i] < src2[j]) {
tmp[k++] = src1[i++];
}
else
tmp[k++] = src2[j++];
}

while (i < start1 + len1) {
tmp[k++] = src1[i++];
}

while (j < start2 + len2) {
tmp[k++] = src2[j++];
}

for (int l : tmp) {
dest[start++] = l;
}

}

public static void recMerge(int dest[], int start, int len ) {

int  size = len / 2;

if (len <= 1) 
return;

recMerge(dest, start, size);
recMerge(dest, start + size, len - size);
merge(dest, start, size, dest, start + size, len - size, dest, start);
}


public static void iterMerge(int[] dest) {
int gap = 1;
int len = dest.length;
int i;

while (gap < len) {
for (i = 0; i <= len - gap * 2; i += gap * 2) {

merge(dest, i, gap, dest, i + gap, gap, dest, i);
}

if (len - i > gap)
merge(dest, i, gap, dest, i + gap, len - i - gap, dest, i);

gap = gap * 2;
}
}

public static void quickSort(int dest[], int start, int len) {
int i = start;
int j = len - 1 + start;
int flag = 0;
int tmp;

if (len <= 0)
return;

while (i < j) {
if (dest[i] > dest[j]) {
tmp = dest[i];
dest[i] = dest[j];
dest[j] = tmp;

flag = 1 - flag;
}

if (flag == 0)
i++;
else
j--;

quickSort(dest, start, i - start);
quickSort(dest, i, len - (i - start));
}
}

public static void adjustHeap(int[] data, int i, int len) {


int l = i * 2 + 1;
int r = i * 2 + 2;
int large;


if (l < len && data[l] > data[i])


large = l;
else
large = i;


if (r < len && data[r] > data[large])
large = r;
// else
// large = i;


if (large != i) {
int tmp;

tmp = data[i];
data[i] = data[large];
data[large] = tmp;


adjustHeap(data, large, len);
}
}

public static void heapSort(int[] data) {

int i;
int len = data.length;

for (i = len / 2; i >= 0; i--) {
adjustHeap(data, i, len);
}

for (i = len - 1; i >= 0; i--) {
int tmp;

tmp = data[0];
data[0] = data[i];
data[i] = tmp;

len--;
adjustHeap(data, 0, len);
}

}


public static void main(String[] args) {

int[] dest = {3, 4, 6, 8, 100, 9, 22, 56, 89, 66};

recMerge(dest, 0, dest.length);
iterMerge(dest);
quickSort(dest, 0, dest.length);
heapSort(dest);
for (int i : dest) {
System.out.print(i + " ");
}

}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快速排序归并排序都是常见的排序算法,它们的时间复杂度如下: 1. 快速排序(Quick Sort)的平均时间复杂度为O(nlogn),最坏情况下的时间复杂度为O(n^2)。 - 在平均情况下,快速排序的时间复杂度为O(nlogn)。这是因为快速排序使用分治策略,每次选择一个基准元素,并将数组分成两个子数组,然后递归地对子数组进行排序。在平均情况下,每次划分将数组分成大小接近一半的两个子数组,因此总的比较和交换次数为O(nlogn)。 - 在最坏情况下,如果每次划分都选择了当前最大或最小的元素作为基准,那么快速排序的时间复杂度将退化到O(n^2)。这种情况下,每次划分只能将数组分成一个子数组和一个空数组,递归调用的次数为n,因此总的比较和交换次数为1 + 2 + ... + n-1 = n * (n-1) / 2,即O(n^2)。 2. 归并排序Merge Sort)的时间复杂度始终稳定在O(nlogn)。 - 归并排序使用分治策略,将待排序的数组分成两个子数组,分别进行排序,然后将两个有序子数组合并成一个有序数组。在归并的过程,需要将元素逐个比较并放入临时数组。在每一层的归并过程,需要进行n次比较和交换操作。总共需要进行logn层的归并,因此总的比较和交换次数为n * logn,即O(nlogn)。 需要注意的是,以上时间复杂度是对算法的整体评估。实际应用,算法的具体实现和优化策略也会对时间复杂度产生影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值