zoukankan      html  css  js  c++  java
  • 快速排序

    先看普通版本

    #include<stdio.h>
    int Partition(int A[],int p,int r)
    {
        //最后一个r做pivot
        int tmp;
        int i=p-1;
        int j=p;
        for(j=p;j<=r-1;j++)
            if(A[j]<=A[r])
    { i
    ++; tmp=A[i];A[i]=A[j];A[j]=tmp; } tmp=A[i+1],A[i+1]=A[r],A[r]=tmp; return i+1; } void QuickSort(int A[],int p,int r) { int q; if(p<r) { q=Partition(A,p,r); QuickSort(A,p,q-1); QuickSort(A,q+1,r); } } int main() { int i,n; int arr[20]; printf("请输入数组的大小"); scanf("%d",&n); printf("请输入数组元素\n"); for(i=0;i<n;i++) scanf("%d",arr+i); QuickSort(arr,0,n-1); printf("快速排序结果为\n"); for(i=0;i<n;i++) printf("%d\t",arr[i]); }

    随机化是从a[p...r]中随机选出的一个元素交换。

    随机化代码是quicksort划分时q=randomized_partition;

    randomized_partition(int a[],int p,int r)
    {
      srand(time(NULL)); //产生不同的种子
    int i=rand()%(r-p+1)+p; // [p,r]; { int tmp=a[r];a[r]=a[i];a[i]=tmp; } return partition(a,p,r); }

    rand()在stdlib.h头文件中。time在头文件time.h中.

    快速排序partition还有一个版本比较流行。

    int partition2(int a[],int p,int r)
    {
        int i,j;
        //a[p] pivot
        i=p+1;
        j=r;
    //这里不能写成while(l<r),否则不会正确排序,比如 5,3,-1,4,7
    while(1) { while(a[i]<a[p]) i++; while(a[j]>a[p]) j--; if(i>=j) break; int tmp=a[i],a[i]=a[j],a[j]=tmp; } int tmp=a[j],a[j]=a[p],a[p]=tmp; //不能写成swap(a[i],a[p]),只能是j. return j; }

    为什么不能写成

    wap(a[i],a[p]),只能是j.可以用2,1,3举例。
    最后i变成了2,j变成1。只能是j是因为a[j]一定是小于pivot的。

    更简单代码:

    int Partition(int a[],int p,int r) 
         
    { 
        int i=p,j=r+1; 
        int x=a[p]; 
        while(1)
        {   
             while(a[++i]<x && i<r); 
             while(a[--j]>x); 
             if(i>=j) break; 
             int temp; //交换两个数的值 
             temp=a[j]; a[j]=a[i]; a[i]=temp; 
        }
    
           a[p]=a[j]; a[j]=x;
           return j; 
    }
  • 相关阅读:
    C# 使用自带Microsoft.Office.Interop.Excel简单操作Excel文件
    Winform修改配置文件节点保存到配置文件
    C# MD5加密字符串
    dev gridcontrol简单的动态设置动态表头
    dev gridcontrol绘制页脚
    dev gridcontrol 导出到excel
    dev gridcontrol设置过滤器下拉列表
    为什么要使用Unix时间戳
    DataTable和DataReader的遍历
    C#生成不重复随机数的方法
  • 原文地址:https://www.cnblogs.com/youxin/p/2474260.html
Copyright © 2011-2022 走看看