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

来源:互联网 发布:java 生成6位随机数 编辑:程序博客网 时间:2024/04/29 18:26

http://blog.163.com/hadyk1111@126/blog/static/29599406200752345233993/

快速排序  http://blog.csdn.net/morewindows/article/details/6684558  分析:数据结构p186.重要  当源文件有序时复杂度是o(n2).此时冒泡排序最好,无序时快速排序是最好的方法。  void QuickSort(int *a,int l,int r)  {      if (r<=l)      {          return;      }      int i=l;      int j=r;      int x=a[i];//a[l]即a[i]就是第一个坑       //挖坑填数      while (j>i)      {           // 从右向左找小于x的数来填a[i]            while (a[j]>=x&&j>i)          {              j--;          }          if (j>i)          {              a[i]=a[j];//a[j]填到a[i]中,a[j]就形成了一个新的坑                i++;          }          // 从左向右找大于或等于x的数来填a[j]            while (a[i]<x&&j>i)          {              i++;          }          if (j>i)          {              a[j]=a[i];//将a[i]填到a[j]中,a[i]就形成了一个新的坑                j--;          }      }      //退出时,i等于j。将x填到这个坑中。      a[i]=x;      //分治法      QuickSort(a,l,i-1);      QuickSort(a,i+1,r);  }  
归并排序  http://blog.csdn.net/morewindows/article/details/6678165  //将有二个有序数列a[first...mid]和a[mid...last]合并。  void mergearray(int a[], int first, int mid, int last, int temp[])  {      int i=first;      int n=mid;      int j=mid+1;      int m=last;      int k=0;      while (i<=n&&j<=m)      {          //比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数          if (a[i]<a[j])          {              temp[k++]=a[i++];          }           else          {              temp[k++]=a[j++];          }      }      //有数列为空,那直接将另一个数列的数据依次取出即可      while (i<=n)      {          temp[k++]=a[i++];      }      while (j<=m)      {          temp[k++]=a[j++];      }     for (i=0;i<k;i++)     {         a[first+i]=temp[i];     }  }  void mergesort(int a[], int first, int last, int temp[])    {        if (first < last)        {            int mid = (first + last) / 2;            mergesort(a, first, mid, temp);    //左边有序            mergesort(a, mid + 1, last, temp); //右边有序            mergearray(a, first, mid, last, temp); //再将二个有序数列合并        }    }  



0 0
原创粉丝点击