计算机算法之快速排序、原址排序、递归的最好应用

原创 2013年12月05日 22:04:14

快速排序是实际应用中常常会用到的一种排序算法:因为它的平均性能非常好:速度也非常快,能够进行原址排序、甚至在虚存环境下也能很好地工作。下面给出一个快速排序在C语言下的实例:

#include "stdio.h"
#include "conio.h"
#define N  24
/*
快速排序算法:时间复杂度是nlg(n),以2为底,不是10!
是实际排序应用中最好的选择,因为它的平均性能非常好
它能够进行原址排序,甚至在虚存环境下也能很好地工作!
注意待排序数组的0号元素并不能用于排序,有特殊作用!
*/
void quickly_sort(int A[],int p,int r)
{
   int q=0;
   if(p<r){
        q=partition(A,p,r);
        quickly_sort(A,p,q-1);
        quickly_sort(A,q+1,r);
   }
}
/*快速排序算法关键的函数如下:它主要实现确定一个数:
这个数的左边的数永远不大于它,而在它右边的数永远不
小于它。 下面的p和r分别表示数组A的下标,p和r构成了
一个区间,在这个区间选择出一个符合要求的数*/
int partition(int A[],int p,int r)
{
    int mid=A[r];  /*假设这个数就是中间数*/
    int i=p-1;
    int j=0,temp=1;
    for(j=p;j<r;j++)
    {
       if(A[j]<mid)
       {
          i=i+1;
          temp=A[j];
          A[j]=A[i];
          A[i]=temp;
       }
    }i++;
    temp=A[r];
    A[r]=A[i];
    A[i]=temp;
    return i;
}
main()
{
    int a[N]={0,2,5,4,3,0,2,8,1,6,7,54,67,4,34,32,12,14,38,21,24,25,78,20},i; /*0号元素没有参加排序,但必须有*/
    quickly_sort(a,1,N-1);
    printf("利用快速算法排序好的数组如下\n");
    for(i=1;i<N;i++) /*0号元素是自行添加,不需要输出*/
        printf(" %d ",a[i]);
    getch();
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

快速排序算法原理及java递归实现

快速排序 对冒泡排序的一种改进,若初始记录序列按关键字有序或基本有序,蜕化为冒泡排序。使用的是递归原理,在所有同数量级O(n longn) 的排序方法中,其平均性能最好。就平均时间而言,是目前被认为最...

递归分治算法之随机快速排序(Java版本)

/** * 递归分治算法学习之随机快速排序 * 采用随机选择枢纽元素的快速排序算法 * @author Sking */ package 递归分治; import java.util.Rand...

算法系列—快速排序及其优化(递归)

快速排序和归并排序是互补的,归并排序将子数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序。而快速排序则是当两个子数组有序时整个数组也就自然有序了。 归并排序:递归调用发生在整个数组处...

快速排序的递归实现算法

快速排序的递归实现算法题目描述: Java实现:import java.util.Random; import java.util.Scanner;public class QuickSort { ...

[算法入门]快速排序非递归方法(Java实现),大家一起来找茬啊~

基础总结一下,快速排序的步骤: 1、找到一个key值(就是数组第一个值),先从右到左找,找到一个比它小的值,记录下标。 2、然后从左往右找,找到一个比它大的值,记录下标。 3、交换找到的两个数字...

《算法图解》书摘-递归/快速排序

第三章 递归 递归只是让解决方案更清晰,并没有性能上的优势。实际上,在有些情况下,使用循环的性能更好。 “如果使用循环,程序的性能可能更高;如果使用递归,程序可能更容易理解。如何选择要...

快速排序经典算法(分治法,挖坑法,前后指针法,非递归)

快速排序最优的情况就是当关键值位于序列中间时 快速排序最坏的情况就是对已序的序列进行排序 时间复杂度:O(N^2)最差 使用场景:数据量大而杂乱的序列,避免出现最坏的情况 快速排序递归算法之分...

快速排序算法的递归深度

在自己做一些排序递归的题的一些详细想法,所以记录下来 题目:对n个记录的线性表进行快速排序为减少算法的递归深度,以下叙述正确的是(A)A、每次分区后,先处理较短的部分 B、每次分区后,先处理较长的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)