博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
快速排序(quicksort)算法实现
阅读量:5987 次
发布时间:2019-06-20

本文共 2257 字,大约阅读时间需要 7 分钟。

 快速排序(quicksort)是分治法的典型例子,它的主要思想是将一个待排序的数组以数组的某一个元素X为轴,使这个轴的左侧元素都比X大,而右侧元 素都比X小(从大到小排序)。然后以这个X在变换后数组的位置i分为左右两个子数组,再分别进行快速排序,直到子数组中只有一个元素为止。
快速排序算法如下
void quicksort(
int A[], 
int p, 
int r)
{
    
int i;
    
if(p < r)
    {
        i = partition(A, p, r);
        quicksort(A, 
0, i - 
1);
        quicksort(A, i + 
1, r);
    }   
}
    其中partition函数将得到X所在的位置i(在这里总以数组的最后一个元素为轴)。
int partition(
int A[], 
int p, 
int r)
{
    
int i = p - 
1, j;
    
for(j = p; j < r; j++)
    {
        
if(A[j] >= A[r])
        {
            i++;
            swap(&A[i], &A[j]);
        }
    }
    swap(&A[i + 
1], &A[r]);
    
return i + 
1;
}
    由于总是选择数组的最后一个元素做为轴,因此可能出现X的左边为n - 1或接近n - 1个元素,而右边没有元素,或元素很少的情况,即X最大或比较大。这样使quicksort将出现最坏的情况,也就是时间复杂度为
O(n^2)。因此partition可以采用随机方式得到轴X的位置i。 这样它的平均情况是非常好的(时间复杂度为
O(nlogn)),也就是说,最坏情况很难出现。
int new_random(
int min, 
int max)
{
    
return (min + (
int)(((
float)rand()/RAND_MAX)*(max - min)));
}
int randomize_partition(
int A[], 
int p, 
int r)
{
    
int i = new_random(p, r);
    swap(&A[i], &A[r]);
    
return partition(A, p, r);
}
完整的代码如下
#include <stdio.h>
#include <stdlib.h>
void out_int_array(
int data[], 
int n)
{
    
int i;
    
for(i = 
0; i < n; i++)
    {
        printf(
"
%d 
", data[i]);
    }
    printf(
"
\n
");
}
void swap(
int *a, 
int *b)
{
    
int x;
    x = *a;
    *a = *b;
    *b = x;
}
int new_random(
int min, 
int max)
{
    
return (min + (
int)(((
float)rand()/RAND_MAX)*(max - min)));
}
int partition(
int A[], 
int p, 
int r)
{
    
int i = p - 
1, j;
    
for(j = p; j < r; j++)
    {
        
if(A[j] >= A[r])
        {
            i++;
            swap(&A[i], &A[j]);
        }
    }
    swap(&A[i + 
1], &A[r]);
    
return i + 
1;
}
void quicksort(
int A[], 
int p, 
int r)
{
    
int i;
    
if(p < r)
    {
        i = partition(A, p, r);
        quicksort(A, 
0, i - 
1);
        quicksort(A, i + 
1, r);
    }   
}
int randomize_partition(
int A[], 
int p, 
int r)
{
    
int i = new_random(p, r);
    swap(&A[i], &A[r]);
    
return partition(A, p, r);
}
void randomize_quicksort(
int A[], 
int p, 
int r)
{
    
int i;
    
if(p < r)
    {
        i = randomize_partition(A, p, r);
        quicksort(A, 
0, i - 
1);
        quicksort(A, i + 
1, r);
    }   
}
int main()
{
    
int A[] = {
4
1
44, -
12
5
125
30};
    
int B[] = {
4
1
44, -
12
5
125
30};
    out_int_array(A, 
7);
    quicksort(A, 
0
6);
    out_int_array(A, 
7);
    printf(
"
--------------------------randomize-----------------------------\n
");   
    srand((unsigned)time( NULL ));
    randomize_quicksort(B, 
0
6);
    out_int_array(B, 
7);
    
return 
0;
}
本文转自银河使者博客园博客,原文链接http://www.cnblogs.com/nokiaguy/archive/2008/05/14/1197172.html如需转载请自行联系原作者
银河使者
你可能感兴趣的文章
iSCSI安装以及配置
查看>>
It is indirectly referenced from required .class file
查看>>
jenkins 自动化集成测试配置(一)
查看>>
进程和线程之间的关系.
查看>>
总结CString、string、char*
查看>>
设置listview,隔行不同style
查看>>
【eoe Android特刊】第二十五期 Android 应用的终端适配
查看>>
Java菜鸟零基础自学入门必备视频教程
查看>>
Git忽略规则和.gitignore规则不生效的解决办法
查看>>
php实现汉诺塔问题
查看>>
linux c++ sqlite3
查看>>
Eclipse自动生成作者、日期注释等功能设置
查看>>
MySQL 按时间统计
查看>>
获取上下文
查看>>
SSL双向认证
查看>>
go语言的time包
查看>>
sheepdog安装和使用管理
查看>>
mycncart 之 支付宝手机网页即时到帐支付方式
查看>>
[Android]ContentProvider会用到的ProjectionMap的用处
查看>>
[Android]Linux BASH脚本中cmp比较命令的应用例子
查看>>