C语言 快速排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 快速排序相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
long i,n,a[10000];
main()

void qsort(long,long);
scanf("%ld*",&n);
for (i=0;i<n;i++)
scanf("%ld*",&a[i]);
qsort(0,n-1);
for (i=0;i<n;i++)
printf("%ld ",a[i]);
getch();

void qsort(long s1,long s2)

long x,i,j,s;
x=a[(s1+s2)/2];
i=s1,j=s2;
if (i>j) return;
while (j>i)

while (a[i]<x) i+=1;
while (a[j]>x) j-=1;
if (i<j)

s=a[i];
a[i]=a[j];
a[j]=s;
j--,i++;


i+=1,j-=1;
for (s=0;s<n;s++) printf("%d ",a[s]);
printf("\n");
printf("%d %d\n",i,j);
if (s1<j) qsort(s1,i);
if (s2>i) qsort(i,s2);


这段代码有错误,不过我想问几个问题

1.上面有一个全局i和sqort的i,是不是把sqort里面那个i的定义去掉就可以了
2. if (s1<j) qsort(s1,i);
if (s2>i) qsort(i,s2);
这两句是怎么回事,我是按1 3 2 4 5这几个数想的,谁能举个能用到上面两句话的例子

3. i+=1,j-=1;这句是为什么
还有那个j--,i++;是为什么

(这个是别人写的)

参考技术A 首先,你要理解快速排序的算法,它是一种递归的算法。每次选择一个基准,让该基准左边的数全小与他,右边的全大于它,这样就是一次循环,将数据分成两段,每次再找基准分成两段。
if (s1<j) qsort(s1,i);
if (s2>i) qsort(i,s2);
就是在分成的左右两段中再排序。
参考技术B 这个程序很糟糕,void qsort(long,long); 不知道是声明还是调用,声明就应该写再main前面(void qsort(long s1,long s2); ),调用就应该写成调用的形式(qsort(s1,s2); )而且你的调用没有传值过去,
还有a[i]中i不可能是long型,
if (s1<j) qsort(s1,i);
if (s2>i) qsort(i,s2);
其实就是排第一遍之后再进行第二遍排序,直到排序完成。本回答被提问者采纳
参考技术C 1.上面有一个全局i和sqort的i,是不是把sqort里面那个i的定义去掉就可以了

不用去掉,全局变量和函数内的互不相干,作用域不同.

2. if (s1<j) qsort(s1,i);
if (s2>i) qsort(i,s2);
这两句是怎么回事,我是按1 3 2 4 5这几个数想的,谁能举个能用到上面两句话的例子
楼上答了.

3. i+=1,j-=1;这句是为什么
i+=1 相当于 i=i+1;
j=j-1;

4.j--,i++;是为什么

j=j-1;
i=i+1;

大话数据结构C语言70 快速排序

目录

背景

快速排序

复杂度

快速排序的优化


背景

快速排序是图灵奖获得者 Tony Hoare设计提出的
快速排序被誉为20世纪十大算法之一
 
希尔排序是直接插入排序的升级,属于插入排序
堆排序是简单选择排序的升级,属于选择排序类
快速排序是冒泡排序的升级,属于交换排序类
 
快速排序是增加了记录的比较和移动的距离,将关键字较大的记录从前面直接移到后面,关键字较小的记录从后边直接移到前面,从而减少了比较次数和移动交换的次数
 
 

快速排序

快排的基本思想是,通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则可以对这两部分记录继续进行排序,以达到整个序列有序的目的
 

复杂度

快排的时间复杂度:
在最优的情况下为nlogn
最坏的情况下为n方
平均情况:nlogn
 
空间复杂度:logn
 
由于关键字的比较和交换是交换式的,因此,快排是一种不稳定的排序方法
 
 
#include <stdio.h>

void swap(int k[], int low, int high)
{
    int temp;

    temp = k[low];
    k[low] = k[high];
    k[high] = temp;
}

int Partition(int k[], int low, int high)
{
    int point;

    point = k[low];

    while( low < high )
    {
        while( low < high && k[high] >= point )
        {
            high--;
        }
        swap(k, low, high);
        
        while( low < high && k[low] <= point )
        {
            low++;
        }
        swap(k, low, high);
    }

    return low;
}

void QSort(int k[], int low, int high)
{
    int point;

    if( low < high )
    {
        point = Partition(k, low, high);

        QSort(k, low, point-1);

        QSort(k, point+1, high);
    }
}

void QuickSort(int k[], int n)
{
    QSort(k, 0, n-1);
}

int main()
{
    int i, a[10] = {4, 2, 5, 0, 3, 9, 1, 7, 6, 8};

    QuickSort(a, 10);

    printf("排序后的结果是:");
    for( i=0; i < 10; i++ )
    {
        printf("%d", a[i]);
    }
    printf("\\n\\n");

    return 0;
}

快速排序的优化

 
1.优化选取基准点
2.优化不必要的交换
3.优化小数组时的排序方案
4.优化递归操作
 

以上是关于C语言 快速排序的主要内容,如果未能解决你的问题,请参考以下文章

用C语言编程实现快速排序算法

C语言 快速排序

菜鸟提问 c语言关于快速排序

用C语言编写函数,要实现快速排序算法或者冒泡法

c语言快速排序算法

大话数据结构C语言70 快速排序