• 【算法导论】第7章快速排序


    1、算法描述

      快速排序也是基于分治模式的,下面是一个典型子数组A[p..r]排序的分治过程,主要分为三个步骤:

      (1)分解:将数组A[p..r]划分成两个子数组A[p...q-1]和A[q+1...r],使得前一个数组中每个值都小于等于A[q],后一个数组每个值都大于A[q],下标q也在这个分解过程中求得。

      (2)解决:通过递归调用对两个子数组分别进行排序。

      (3)合并:两个子数组是就地进行排序的,所以他们的合并并不需要操作,这个数组已经有序了。。

    2、具体实现:

      形参和实参的区别:

      (1)实现一:

    View Code
     1 #include<stdio.h>
     2 int partition(int *ptr,int p,int r)//一次划分过程
     3 {
     4     int i,j,temp;
     5     int x=*(ptr+r-1);
     6     i=p-1;
     7     for(j=p;j<r;j++)
     8     {
     9         if(*(ptr+j-1)<=x)
    10         {
    11             i++;
    12             temp=*(ptr+j-1);
    13             *(ptr+j-1)=*(ptr+i-1);
    14             *(ptr+i-1)=temp;
    15         }
    16     }
    17     i++;
    18     temp=*(ptr+i-1);
    19     *(ptr+i-1)=*(ptr+r-1);
    20     *(ptr+r-1)=temp;
    21     return(i);
    22 }
    23 void quicksort(int *ptr,int p,int r)//递归排序
    24 {
    25     int q;
    26     if(p<r)
    27     {
    28         q=partition(ptr,p,r);
    29         quicksort(ptr,p,q-1);
    30         quicksort(ptr,q+1,r);
    31     }
    32 }
    33 void main()
    34 {
    35     int a[8]={2,8,7,1,3,5,6,4};
    36     quicksort(a,1,8);
    37     for(int i=0;i<8;i++)
    38         printf("%d  ",a[i]);
    39 }

      (2)实现二:

    View Code
     1 #include<stdio.h>
     2 int partition(int ptr[],int p,int r)//一次划分过程
     3 {
     4     int i,j,temp;
     5     int x=ptr[r-1];
     6     i=p-1;
     7     for(j=p;j<r;j++)
     8     {
     9         if(ptr[j-1]<=x)
    10         {
    11             i++;
    12             temp=ptr[j-1];
    13             ptr[j-1]=ptr[i-1];
    14             ptr[i-1]=temp;
    15         }
    16     }
    17     i++;
    18     temp=ptr[i-1];
    19     ptr[i-1]=ptr[r-1];
    20     ptr[r-1]=temp;
    21     return(i);
    22 }
    23 void quicksort(int ptr[],int p,int r)//递归排序
    24 {
    25     int q;
    26     if(p<r)
    27     {
    28         q=partition(ptr,p,r);
    29         quicksort(ptr,p,q-1);
    30         quicksort(ptr,q+1,r);
    31     }
    32 }
    33 void main()
    34 {
    35     int a[8]={2,8,7,1,3,5,6,4};
    36     quicksort(a,1,8);
    37     for(int i=0;i<8;i++)
    38         printf("%d  ",a[i]);
    39 }
  • 相关阅读:
    判断IE浏览器的版本号
    解决下拉框第一行出现空格的问题
    Springboot整合log4j2日志全解
    Java NIO之Selector(选择器)
    ZooKeeper客户端 zkCli.sh 节点的增删改查
    Java API操作ZooKeeper
    ReentrantLock(重入锁)功能详解和应用演示
    MySQL高可用集群方案
    Redis高可用之集群配置(六)
    linux free命令详解
  • 原文地址:https://www.cnblogs.com/lpshou/p/2553125.html
Copyright © 2020-2023  润新知