| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 620 人关注过本帖
标题:快速排序~
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏
已结贴  问题点数:5 回复次数:4 
快速排序~
~
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#define MAX 255
int R[MAX]={0};
int Partition(int i,int j);
void Quick_Sort(int low,int high);
int main()
{
    int i=0;
    int j=0;
    int n=0;
    system("cls");

    puts("Please input total element number of the sequence:");
    scanf("%d",&n);

    if (n<=0||n>MAX)
    {
        printf("n must mort than 0 and less than %d.\n",MAX);
        exit(0);
    }

    puts("Please input the elements one by one:");

    for (i=1;i<=n;++i)
        scanf("%d",&R[i]);

    puts("The sequence you input is:");

    for (i=1;i<=n;++i)
        printf("%-4d",R[i]);

    Quick_Sort(1,n);

    puts("\nThe sequence after quick_sort is:");

    for (i=1;i<=n;++i)
        printf("%-4d",R[i]);

    puts("");

    return 0;
}
int Partition(int i,int j)
{
    /*调用Partition(R,low,high)时,对R[low..high]做划分,
    并返回基准记录的位置*/
    int pivot=R[i];
    /*用区间的第一个记录作为基准*/
    while (i<j)
    {
        /*从区间两端交替向中间扫描,直至i=j为止*/
        while (i<j&&R[j]>=pivot)
            j--;
        /*从右向左扫描,查找第一个关键字
        小于pivot.key*/
        if (i<j)
            R[i++]=R[j];
        /*相当于交换R[i]和R[j],交换后指针加1*/
        /*pivot相当于在位置j上*/
        while (i<j&&R[i]<=pivot)
            i++;
        /*从左向右扫描,查找第一个关键字大于pivot.key的记录R[i]*/
        /*表示找到了R[i],使R[i].key>pivot.key*/
        if (i<j)
            R[j--]=R[i];
        /*相当于交换R[i]和R[j],交换后j指针减1*/
    }

    R[i]=pivot;
    /*基准记录已被最后定位*/
    return i;
}
void Quick_Sort(int low,int high)
{
    /*对R[low..high]快速排序*/
    int pivotpos=0;
    /*划分后的基准记录的位置*/
    if (low<high)
    {
        /*仅当区间长度大于1时才须排序*/
        pivotpos=Partition(low,high);
        /*对R[low..high]做划分*/
        Quick_Sort(low,pivotpos-1);
        /*对左区间递归排序*/
        Quick_Sort(pivotpos+1,high);
        /*对右区间递归排序*/
    }
}


[此贴子已经被作者于2017-2-19 23:34编辑过]

2017-02-19 23:16
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 



[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-19 23:17
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 2楼 九转星河
突然知道了发空帖子的秘密~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-19 23:20
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:5 




 
  



早知做人那么辛苦!  当初不应该下凡
2017-02-20 00:42
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
自己动手练习~
程序代码:
#include<stdio.h>
#include<stdlib.h>

void creat(int** a,int* n);
void input(int a[],int n);
void print(int a[],int n);
void fun_1(int a[],int left,int right);
int fun_2(int a[],int i,int j);

int main()
{
    int* a=NULL;
    int n=0;

    creat(&a,&n);

    input(a,n);

    fun_1(a,0,n-1);

    print(a,n);

    free(a);

    return 0;
}
void creat(int** a,int* n)
{
    printf("请输入排序数目:");
    scanf("%d",n);

    if (*n<1||(*a=(int* )malloc(*n*sizeof(int )))==NULL)
        exit(0);
}
void input(int a[],int n)
{
    int i=0;

    printf("请输入%d个数据:\n",n);
    for (;i!=n;++i)
        scanf("%d",&a[i]);
}
void print(int a[],int n)
{
    int i=0;

    puts("输出数据如下:");

    for (;i!=n;++i)
        printf("%-4d",a[i]);

    puts("");
}
void fun_1(int a[],int left,int right)
{
    int k=0;

    if (left<right)
    {
        k=fun_2(a,left,right);

        fun_1(a,k+1,right);

        fun_1(a,left,k-1);
    }
}
int fun_2(int a[],int i,int j)
{
    int key=a[i];

    while (i<j)
    {
        while (i<j&&a[j]>=key)
            --j;

        if (i<j)
            a[i++]=a[j];

        while (i<j&&a[i]<=key)
            ++i;

        if (i<j)
            a[j--]=a[i];
    }

    a[i]=key;

    return i;
}


[此贴子已经被作者于2017-2-20 14:14编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-20 14:13
快速回复:快速排序~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023443 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved