`
xiao5233
  • 浏览: 26249 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

分治法排序,快速排序,归并排序

阅读更多
package com.comm.test;


import java.util.Collection;
import java.util.Collections;

import javax.swing.text.html.StyleSheet.ListPainter;

import oracle.net.aso.i;

import org.junit.Test;


//快速排序:最坏情况下运行时间O(n^2),平均运行时间O(nlogn),不需要辅助空间。不稳定的排序。
//归并排序:最好和最坏下,运行时间都为O(nlogn),需要辅助空间,稳定的排序。

public class SortTest {

public void mergeSort(int[] list,int x,int y,int[] temp){
int p,q,m,i=x;
if(y-x>1){//至少有2个元素
m=x+(y-x)/2;//求中间下标
p=x;
q=m;
mergeSort(list, x, m, temp);//排序前半段
mergeSort(list, m, y, temp);//排序后半段

while(p<m||q<y)//表示前半部分序列和后半部分序列只要有一个没有遍历完
{
if (q>=y||(p<m&&list[p]>list[q]))
{
temp[i++] = list[p++];//复制前半部分
}
else
{
temp[i++] = list[q++];//复制后半部分
}
}

    for(i=x;i<y;i++)
    list[i] = temp[i];//把临时空间的值复制到原数组
   
}

}

//快速排序  由于最先是hoare提出的所以叫hoare sort
public void HoareSort(int[] list,int left,int right){
int x=left;
int y=right;
while(x<y){
//以第一个元素为基数,  首先从最右边与基数比较,如果比基数小则 退出while
将它与基数交换。
//如果等于或大于基数 则y--  向左移动 ,直到找到一个比基数小的数为止
while(list[y]>=list[x]&&y>x){
y--;
}
if(y>x){
int temp=list[y];
list[y]=list[x];
list[x]=temp;
x++;
}
//交换一次之后,从左边往右边开始查找 找到一个比基数大的数为止,然后交换。
//如此循环 直到 x>y  , 就已经完成一轮。 已经 按 基数 分成两个部分,
//左边比基数小 右边比基数大,
while(list[x]<=list[y]&&y>x){
x++;
}
if(y>x){
int temp=list[y];
list[y]=list[x];
list[x]=temp;
y--;
}

}
//然后递归调用,将左边部分 和右边部分,继续快速排序。

if(x==y){
HoareSort(list, left, x-1);
HoareSort(list, x+1, right);
}



}

@Test
public void sort(){
int[] list={2,5,1,8,4,7,2,0,1,2,6};
int[] temp=new int[11];

mergeSort(list,0, list.length, temp);
for (int i : list) {
System.out.print(i+",");
}

list=new int[] {2,5,1,8,4,7,2,0,1,2,6};

HoareSort(list, 0, list.length-1);
System.out.println();
for (int i : list) {
System.out.print(i+",");
}

}

}
分享到:
评论

相关推荐

    分治法应用(二分查找归并排序快速排序比赛日程安排)

    分治法是一种重要的计算机科学算法,它将一个大问题分解为若干个规模较小的相同或相似的子问题,然后递归地解决这些子问题,最后将子问题的解合并成原问题的解。这种策略有助于简化问题处理,提高效率,并在某些情况...

    分治法实现排序

    其中,归并排序和快速排序就是基于分治法的典型应用。 **分治法的三步走** 1. **分解**:将原问题分解为多个规模较小但结构相同的子问题。例如,在排序问题中,我们可以将数组分为两半。 2. **解决**:递归地解决...

    使用分治法的插入排序

    在大型数据集上,快速排序、归并排序等更高效的算法更为适用。然而,插入排序是其他高级排序算法如希尔排序和快速排序的基础,对于理解排序算法的原理具有重要意义。 总的来说,插入排序是一种简单而直观的排序算法...

    归并排序(Merge sort)(台灣譯作:合併排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

    归并排序(Merge Sort)是一种基于分治策略的高效排序算法,由计算机科学家John W. Backus于1945年提出。它的工作原理可以分为三个主要步骤:分解、解决和合并。 1. 分解:将原始数据序列分成两个相等(或接近相等...

    分治法-归并排序

    归并排序是基于分治法的一个经典实例。它用于对一个无序的序列进行排序。归并排序的工作原理如下: 1. **分解**:将原始序列分成两个相等(或近似相等)的部分。 2. **解决**:对每个部分递归地应用归并排序,直到...

    数据结构堆排序 快速排序 归并排序

    本文将深入探讨三种常见的高效排序算法:堆排序、快速排序和归并排序。它们都是基于不同的原理和策略,具有各自的优势和适用场景。 首先,堆排序是一种基于比较的排序算法,利用了二叉堆的数据结构。二叉堆是一个...

    C语言分治法实现归并排序

    将两个及其以上的有序表合并为一张有序表,把待排序序列通过分治法分为若干个有序子序列,然后每两个子序列合并为一个子序列,经过多次合并后整合为一张有序表。 排序过程如图: 代码如下: #include stdio.h #...

    分治法快速排序算法QuickSort

    在这个场景中,我们主要关注的是如何运用分治法实现快速排序。 快速排序的基本步骤如下: 1. **选择枢轴**:从待排序的数组中选取一个元素作为“枢轴”(pivot)。这个元素将作为划分的标准,使得数组被分成两部分...

    算法分析 2.3快速排序 分治法

    归并排序也是基于分治法的排序算法,但与快速排序不同的是,它不是通过交换元素来实现排序,而是通过合并已排序的子数组来达到目的。归并排序的过程如下: 1. **分割**:将原始数组分为两个或更多个子数组,每个子...

    分治法:快速排序的示例程序

    在快速排序的过程中,不需要像归并排序那样实际合并子数组,因为数组的顺序在每次分区后已经得到了更新。 在实现快速排序的示例程序中,通常会包含以下几个关键函数: - **partition()**:此函数负责选取基准并...

    分治法实现归并排序算法算法设计与分析实验报告.docx

    **实验报告:分治法实现归并排序算法** 实验名称:分治法实现归并排序算法 实验日期:年月日 姓名: 学号: 专业班级: ### 一、实验要求 1. **理解分治法**:分治法是一种解决问题的策略,适用于将大问题分解成...

    快速排序、归并排序、堆排序 并比较排序时间

    快速排序、归并排序和堆排序都是经典且高效的排序算法,它们各自具有独特的实现方式和性能特点。这篇文章将详细探讨这三个排序算法,并对比它们的时间复杂度。 首先,我们来看快速排序。快速排序由C.A.R. Hoare在...

    冒泡排序,选择排序,插入排序,希尔排序,堆排序,归并排序,快速排序源码实现

    6. **归并排序**:归并排序是利用分治法的一个非常典型的应用。将待排序的序列分为两半,分别对这两半进行排序,然后将排序后的两个子序列合并成一个有序序列。源码实现中,需要递归地进行分治操作,以及一个合并...

    分治法排序

    分治法排序 归并排序与二分查找 算法课课件

    快速排序算法以及归并算法

    归并排序是一种稳定的排序算法,同样基于分治法。它将数组分成两半,递归地排序每一半,然后将两个已排序的半数组合并成一个有序数组。 #### Java 实现代码分析 `Project17_Merge` 类展示了归并排序的实现。其关键...

    快速排序、堆排序、归并排序、希尔排序实现

    快速排序、堆排序、归并排序和希尔排序是四种经典的排序算法,它们在计算机科学中有着广泛的应用。这里我们将深入探讨这些排序算法的原理、实现方式以及它们在C++编程中的应用。 **快速排序(Quick Sort)** 快速...

    c++ 7 种排序.快速排序, 归并排序,插入排序,选择排序,起泡排序,堆排序,希尔排序

    下面将详细讲解这7种排序算法:快速排序、归并排序、插入排序、选择排序、冒泡排序、堆排序以及希尔排序。 1. **快速排序**:由C.A.R. Hoare提出的,采用分治策略。基本思想是选取一个基准元素,通过一趟排序将待...

    用C实现快速排序、希尔排序、归并排序等排序算法

    本篇将详细探讨快速排序、希尔排序和归并排序这三种在C语言中常见的排序算法。 首先,我们来看快速排序(Quick Sort)。快速排序由C.A.R. Hoare在1960年提出,其基本思想是分治法。它的核心是选择一个基准元素,...

    JAVA排序算法: 直接插入,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序

    7. **归并排序**:归并排序也是基于分治法,将数组拆分成两半,分别排序,然后再合并两个已排序的子数组。由于需要额外的存储空间,归并排序不是原地排序,但它具有稳定的排序特性,且在最坏、最好和平均情况下时间...

    VC++多线程实现三种排序算法比较----冒泡排序、快速排序、归并排序

    它的基本思想是采用分治法,选取一个基准值,将待排序数组分为两部分,一部分的所有元素都小于基准值,另一部分的所有元素都大于基准值,然后再对这两部分分别进行快速排序。快速排序的平均时间复杂度为O(n log n),...

Global site tag (gtag.js) - Google Analytics