• 快速排序


    先看普通版本

    #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; 
    }
  • 相关阅读:
    select into 和 insert into select 两种表复制语句
    hql to_number
    Oracle密码过期the password has expired解决办法
    SQL脚本修改表结构
    JSP -- EL表达式
    cascade属性
    FetchType与FetchMode的区别
    @OneToMany、@ManyToOne以及@ManyToMany讲解
    Jackson实现Object对象与Json字符串的互转
    Python 编码规范
  • 原文地址:https://www.cnblogs.com/youxin/p/2474260.html
Copyright © 2020-2023  润新知