经典算法之快速排序的C实现方法

这里所实现的快速排序是参考《算法导论》上的伪代码,虽然之前对着伪代码敲过一遍,可是现在抛开伪代码,自己敲还是有些费劲。<-_->!!

特别需要注意的是算法导论中的快排方法,和课上讲的不太一样,课上讲的主要是利用首尾两个下标来实现, 而算法导论中,主要是 从前到后,依次判断,将小于privot 的值全部移到 i 的前面去。这里 i 是指 小于 privot值的下标上界。

源代码如下:

// =====================【快速排序】==================
// @ author         :           zhyh2010
// @ date           :           20150606
// @ version        :           1.0
// @ description    :
// =====================【快速排序】==================

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NUM 20
int arr[NUM] = { 0 };

void init()
{
    time_t tm;
    time(&tm);
    srand((unsigned int)tm);

    int max_item = 100;
    for (int i = 0; i != NUM; i++)
        arr[i] = rand() % max_item;
}

void swap(int * pa, int * pb)
{
    int aa = *pa;
    int bb = *pb;

    aa = aa ^ bb;
    bb = aa ^ bb;
    aa = aa ^ bb;

    *pa = aa;
    *pb = bb;
}

int partition(int low, int high)
{
    int i = low - 1;            // 标记 <= privot的上限
    int privot = arr[high];

    for (int j = low; j != high; j++)
    {
        if (arr[j] <= privot)       // 把小的值移到 i 前面去
            swap(&arr[++i], &arr[j]);
    }
    swap(&arr[i + 1], &arr[high]);
    return i + 1;
}

void display(int * arr)
{
    for (int i = 0; i != NUM; i++)
        printf("%-10d", arr[i]);
    printf("\n");
}

void QuickSort(int low, int high)
{
    if (low >= high)
        return;

    int mid = partition(low, high);
    QuickSort(low, mid - 1);
    QuickSort(mid + 1, high);
}

void main()
{
    init();
    printf("快速排序前\n");
    display(arr);
    QuickSort(0, NUM - 1);
    printf("快速排序后\n");
    display(arr);
}
时间: 2024-08-05 17:47:05

经典算法之快速排序的C实现方法的相关文章

【经典算法】快速排序

与归并排序一样,快速排序使用也使用了分治的思想.下面是对一个典型的子数组A[p,...,r]进行快速排序的三步分治过程: 分解:数组A[p,...,r]被划分成两个(可能为空)子数组A[P,...,q-1]和A[q+1,...,r],使得A[p,...,q-1]中每个元素都小于等于A[q],而A[q]也小于等于A[q+1,...,r]中的每个元素.其中,计算下标q也是划分过程的一部分. 解决:通过递归调用快速排序,对子数组啊A[P,...,q-1]和A[q+1,...,r]进行排序. 合并:因为

经典算法学习——快速排序

快速排序应该算是在面试笔试中最常用的算法了,各位面试官都非常喜欢.排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,其中的思想也是用了分治法和递归的思想.示例代码上传到:https://github.com/chenyufeng1991/QuickSort 算法的基本思想是: (1)先从数列中取出一个数作为基准数(常常选第一个数): (2)分区过程,比这个数大的数放到它的右边,小于或等于的数全放到它的左边: (3)再对左右区间重复第二步,直到每个区间只有一个数位置,即左边

经典算法之归并排序的C实现方法

以前写过归并排序的算法,但是时间过了好久,忘记怎么写的了,(也是醉了).正好复习算法的时候遇到这个问题,就重新写了一下,把遇到的一些问题顺便记录一下. 核心就是用两个子数组记录分割后的两个数组中的变量, 然后依次比较大小即可. 这里有个细节需要注意一下, arr_temp1[mid + 1 - low] = INT_MAX; 这段代码,用来设置一个哨兵, 用这种方法可以避免判断数组是否为空了 具体的算法的伪代码可以参考<算法导论> Chapter 2 算法基础, P17 源代码如下: // =

【经典算法】快速排序算法

原文地址:http://blog.csdn.net/morewindows/article/details/6684558 作者:MoreWindows 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影.总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序

【从零学习经典算法系列】分治策略实例——快速排序(QuickSort)

在前面的博文(http://blog.csdn.net/jasonding1354/article/details/37736555)中介绍了作为分治策略的经典实例,即归并排序,并给出了递归形式和循环形式的c代码实例.但是归并排序有两个特点,一是在归并(即分治策略中的合并步骤)上花费的功夫较多,二是排序过程中需要使用额外的存储空间(异地排序算法<out of place sort>). 为了节省存储空间,出现了快速排序算法(原地排序in-place sort).快速排序是由东尼·霍尔所发展的一

[经典算法题]寻找数组中第K大的数的方法总结

[经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26 字体:[大 中 小] 打印复制链接我要评论 今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,本人在网上搜索了一番,查找到以下的方式,决定很好,推荐给大家. 所谓"第(前)k大数问题"指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题.

经典白话算法之快速排序

[分析] [伪代码] [运行过程] [代码] /********************************* * 日期:2014-04-01 * 作者:SJF0115 * 题目:快速排序 **********************************/ #include <iostream> #include <stdio.h> using namespace std; //对子数组array[p...r]就地重排 int Partition(int array[],i

经典算法系列一-快速排序

写一个系列的经典算法,共同学习! 1.快速排序 基本思想: 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. 3.再对左右区间重复第二步,直到各区间只有一个数. 在网上看到一篇博客,把快速排序命名为 挖坑填数+分治法,感觉很有道理,所以等会程序就按这两部来写. 先说说挖坑填数的思想: 1.i=L;j=R; 将基数挖出形成第一个坑a[i]. 2.j--由后向前找出比它的小的数,找到后挖出此数填前一个坑a[i]. 3.i++由前向后

经典算法之排序方法大全

经典排序算法之简单选择排序 http://m.blog.csdn.net/article/details?id=47321309 经典排序算法之冒泡排序 http://m.blog.csdn.net/article/details?id=47318573 经典排序算法之直接插入排序 http://m.blog.csdn.net/article/details?id=47321635 经典排序算法之希尔排序 http://m.blog.csdn.net/article/details?id=473