合并排序和快速排序

     /* 合并排序 O(n*lgn)  */
    #include <iostream>
    using namespace std;  

    #define MAXN 100
    int a[MAXN]; 

    void Merge(int a[MAXN],int left,int mid,int right)
    {
         int i,j,k;
         int n1=mid-left+1;
         int n2=right-mid;
         int L[MAXN],R[MAXN];
         for(i=1;i<=n1;i++)
             L[i]=a[left+i-1];
         for(j=1;j<=n2;j++)
             R[j]=a[mid+j];  

         i=j=1;
         for(k=left;k<=right;k++)
         {
             if(i==n1+1)//L中已经无元素,将R剩余元素复制到a中
             {
                 a[k]=R[j];
                 j++;
             }
             else if(j==n2+1)//R中已经无元素,将L剩余元素复制到a中
             {
                 a[k]=L[i];
                 i++;
             }
             else
             {
                 if(L[i]<R[j])
                 {
                     a[k]=L[i];
                     i++;
                 }
                 else
                 {
                     a[k]=R[j];
                     j++;
                 }
             }
         }
    }   

    void MergeSort(int a[MAXN],int left,int right)
    {
         int mid;
         if(left<right)
         {
             mid=(left+right)/2;
             MergeSort(a,left,mid);
             MergeSort(a,mid+1,right);
             Merge(a,left,mid,right);
         }
    }  

    int main()
    {
        int n,i;
        cout<<"输入n:\n";
        cin>>n;
        for(i=0;i<n;i++)
            cin>>a[i];

        MergeSort(a,0,n-1); 

        cout<<"分治法排序后:\n";
        for(i=0;i<n;i++)
            cout<<a[i]<<" "; 

        cout<<endl;
        return 0;
    }
/*快速排序*/
#include<iostream>
using namespace std;

int AdjustArray(int s[],int left,int right) //返回调整后基准数的位置
{
    int i=left,j=right+1;
    int x=s[left]; //s[l]即s[i]就是第一个坑 

     while (i<j)
    {
        // 从右向左找小于x的数来填s[i]
        while(i<j&&s[j]>=x)
            j--;
        if(i<j)
        {
            s[i]=s[j]; //将s[j]填到s[i]中,s[j]就形成了一个新的坑
            i++;
        }  

        // 从左向右找大于或等于x的数来填s[j]
        while(i<j&&s[i]<x)
            i++;
        if(i<j)
        {
            s[j]=s[i]; //将s[i]填到s[j]中,s[i]就形成了一个新的坑
            j--;
        }
    }
    //退出时,i等于j。将x填到这个坑中。
    s[i] = x;
    return i;
}  

void quick_sort1(int s[],int left,int right)
{
    if (left<right)
    {
        int i=AdjustArray(s,left,right);//先成挖坑填数法调整s[]
        quick_sort1(s,left,i-1); // 递归调用
        quick_sort1(s,i+1,right);
    }
}  

//测试
int main()
{
    int a[9]={22,44,11,89,99,45,43,22,66};
    quick_sort1(a,0,8);
    for(int i=0;i<9;i++)
        cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}

注:快速排序转自 http://blog.csdn.net/morewindows/article/details/6684558

合并排序和快速排序

时间: 2024-11-05 15:53:50

合并排序和快速排序的相关文章

算法有插入排序,堆排序,合并排序,快速排序和stooge排序

比较的算法有插入排序,堆排序,合并排序,快速排序和stooge排序, 先说一下比较结果 1,比较插入和stooge排序,stooge的表现如此之差,数组大小在2000时 InsertSort VS StoogeSort 's Running Time:     16ms:47672ms; Terribly! Isn't It? 所以在后面的比较中,没有带stooge这个垃圾算法 2,插入排序,堆排序,合并排序,快速排序运行时间对比 (网易博客的表格功能太差了,不爽,只好以文本对齐展现给大家了):

使用合并排序和快速排序对字符串按长度排序

前段时间要对字符串集合进行按长度排序,字符串长度长的排在队列前面,最短的排在最后,可以使用两种排序方法进行排序,其中快速排序的效能会好些,但快速排序在字符串的集合非常大的时候,有时会得不到正确的结果,具体原因还不清楚. 1.合拼排序的代码 using System; using System.Collections.Generic; using System.Text; namespace FtpproxyDownRule.DBUtility { public class sortbyStrin

递归与分治-合并排序、快速排序以及循环赛问题

合并排序 合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 递归方法: 基本思想是:将待排序元素分成大小一致相同的2个子集和,分别对两个子集和进行排序,最终将排好序的子集合并成所需要的排好序的集合 package com.gqx.arithmetic.Recursion; public class Recursion_Merge2 { private static void mergeSort(

分治法-合并排序和快速排序

分治法是按照以下方案工作的: 将问题的实例划分为同一个问题的几个较小的实例,最好拥有同样的规模 对这些较小的实例求解(一般使用递归方法,但在问题规模足够小的时候,有时会利用另一种算法以提高效率) 如果必要的话,合并较小问题的解,以得到原始问题的解 分治法的流程: 4.1 合并排序 合并排序是成功应用分治技术的一个完美例子(书上说的). 对于一个需要排序的数组,合并排序把它一分为二,并对每个子数组递归排序,然后把这两个排好序的子数组合并为一个有序数组. 代码实现: /** * 合并排序 * @au

如何优化合并排序和快速排序

和并排序和快速排序在元素的重复率特别高的时候排序的时间变长.我们可以利用三向切分的办法来避免相同的元素进行交换,以减少交换次数. 具体如下图所示: 总共有3个指针,lt,i,和gt,这个三个指针分别指着队首,队首的下一位,队尾.以队首为参考点,设该数组为a.设中间变量temp. temp ← a[lt] //队首设为参考变量 if a[i] < temp:           swap(a,lt++,i++) else if a[i] > temp:           swap(a,i,j-

3种sort:insertion_sort,merge_sort,quick_sort 插入排序 合并排序 快速排序

插入排序,普通排序 一般 前端够用,样本容量小于1000,根本看不出性能问题 function insertion_sort(arr){ var len=arr.length; for(var j=1;j<len;j++){ var key=arr[j]; var i=j-1; while(i>=0&&arr[i]>key){ arr[i+1]=arr[i]; i=i-1; } arr[i+1]=key; } } 合并排序 merge_sort function _mer

插入排序、合并排序、堆排序和快速排序

1 * 插入排序 2 * 时间复杂度O(n2) 3 * @param array原地排序算法 4 */ 5 public void insertSort(int[] array) { 6 for (int i = 1; i < array.length; i++) { 7 int present = array[i]; 8 int position = i; 9 while (position > 0 &;&; array[position - 1] > present)

一步一步写算法(之合并排序)

原文:一步一步写算法(之合并排序) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面一篇博客提到的快速排序是排序算法中的一种经典算法.和快速排序一样,合并排序是另外一种经常使用的排序算法.那么合并排序算法有什么不同呢?关键之处就体现在这个合并上面. 合并算法的基本步骤如下所示: 1)把0~length-1的数组分成左数组和右数组 2)对左数组和右数组进行迭代排序 3)将左数组和右数组进行合并,那么生成的整个数组就是有序的数据数组 下面

php 实现冒泡算法排序、快速排序、选择排序,插入排序

许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌握的.下面是我按自己的理解,将四个方法分析一遍. 需求:分别用 冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中 的值按照从小到的顺序进行排序.  $arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序法   *     思路分析:法如其名,就是像冒