zoukankan      html  css  js  c++  java
  • 【算法导论】第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 }
  • 相关阅读:
    利用jmSlip写一个移动端顶部日历选择组件
    JS写的排序算法演示
    jmSlip WEB前端滑屏组件
    如何:使用 Visual Basic 编写基于 Unity3D 的计算器
    验证 .NET 4.6 的 SIMD 硬件加速支持的重要性
    VB 2015 的 闭包(Closure)
    VS "15" 预览 5 中 VB 15 新增的功能
    演练:使用Xamarin.Forms开发产品介绍性质的应用(VB版)
    UWP游戏防内存修改器的方法
    优化win2d实现的萤火虫粒子效果
  • 原文地址:https://www.cnblogs.com/lpshou/p/2553125.html
Copyright © 2011-2022 走看看