归并排序和快速排序的相同点和不同点(JAVA)
程序员文章站
2022-05-13 19:33:16
...
首先我们贴出来快速排序的代码
public class QuickSort {
public int QuickSort(int[] a, int left, int right) {
int temp = a[left];
while(left < right)
{
while(left < right && a[right] >= temp)
{
right--;
}
if(left < right && a[right] < temp)
{
a[left] = a[right];
}
while(left < right && a[left] <= temp)
{
left++;
}
if(left < right && a[left] > temp)
{
a[right] = a[left];
}
}
a[left] = temp;
return left;
}
public void partion(int a[], int left, int right) {
int num;
if(left < right)
{
num = QuickSort(a, left, right);
partion(a, left, num-1);
partion(a, num + 1, right);
}
}
public static void main(String[] args) {
int a[] = {7, 2, 3, 8, 9, 6, 5, 1, 4};
QuickSort test = new QuickSort();
test.partion(a, 0, 8);
for(int i = 0; i < 9; i++)
{
System.out.print(a[i]);
}
}
}
其次我们贴出归并排序的代码
public class MergeSort {
public void merge(int[] a, int left, int right) {
if(left + 1< right) {
int mid = (left + right) / 2;
merge(a, left, mid);
merge(a, mid, right);
mergesort(a, left, mid, right);
}
}
public void mergesort(int[] a, int left, int mid, int right) {
int testl[] = new int[10000];
int testr[] = new int[10000];
int n1 = mid - left;
int n2 = right - mid;
testl[n1] = Integer.MAX_VALUE;
testr[n2] = Integer.MAX_VALUE;
int num = right - left;
for(int i = 0; i < n1; i++) testl[i] = a[left + i];
for(int i = 0; i < n2; i++) testr[i] = a[mid + i];
int i = 0;
int j = 0;
for(int k = left; k < right; k++)
{
if(testl[i] < testr[j])
{
a[k] = testl[i];
i++;
}
else
{
a[k] = testr[j];
j++;
}
}
}
public static void main(String[] args) {
int[] a = {7, 2, 3, 8, 9, 6, 5, 1, 4};
MergeSort test = new MergeSort();
test.merge(a, 0, 9);
for(int i = 0; i < 9; i++)
System.out.print(a[i]);
}
}
阅读完这两个代码,我们可以发现这两种排序都存在递归,而差别则在于它们递归的顺序。
归并排序:是先递归在排序
快速排序:是先找到分割的标志来将数组进行大致的切割(标志的左边都是小于标志的值,右边都是大于标志的值),然后再进行递归
当然这两种排序的时间复杂度和空间复杂度也不相同
快速排序的时间复杂度为最快情况为O(nlogn),最坏情况为O(n*n),小计快速排序是冒泡排序的思想改进,快速排序是从整体到部分再到个体,而冒泡排序则是一个个个体去比较,所以快速排序更为高级,当然因为追求过快,而导致不稳定,最坏情况的出发条件则是一个有序的数组,且取得标志为数组的最大值或者最小值,这种情况也可能会导致栈递归过深,导致栈溢出,空间复杂度O(logn);
归并排序的时间复杂度最好情况最坏情况都为O(nlogn)。空间复杂度O(n)。
推荐阅读
-
java选择排序下标交换和下标对应的值的交换
-
【PHP面试题】通俗易懂的两个面试必问的排序算法讲解:冒泡排序和快速排序
-
ObjectC----字典类和集合类以及快速枚举和OC中的数组排序
-
GOLANG版的冒泡排序和快速排序分享
-
php和java的面向对象选择排序实例讲解
-
编程初学者入门7_公务员面试现场打分。有7位考官,从键盘输入若干组成绩,每组7个分数(百分制),去掉一个最高分和一个最低分,输出每组的平均成绩。(复习冒泡排序+C、Java中局部变量不赋值不能使用))
-
选择排序、冒泡排序、插入排序、归并排序、快速排序的Java实现以及优化
-
java数组的排序和查找算法
-
快排和归并排序思维的应用
-
数据结构与算法帮你记之——归并排序和快速排序