编程珠玑总结—column 11 Sorting

news/2024/7/10 3:51:01 标签: sorting, 编程, 算法, 优化
Technorati 标签: 算法, 笔记

插入排序:

   1: for i = [1,n)
   2:     for (j = i; j>0 && x[j-1]>x[j]; j--)
   3:         swap(j-1, j)

可以进一步优化上面的算法(代码调整):

   1: for i = [1, n)
   2:     t = x[i]
   3:     for (j=i; j>0 && x[j-1]>x[j]; j--)
   4:         x[j] = x[j-1];
   5:     x[j] = t;

 

快速排序:

方法一:(维持循环不变量)

t

 

>=t?
l                                        m i                                                              u

   1: void qsort1(l, u)
   2:     if l>=u 
   3:         return 
   4:     m = l
   5:     for i=[l+1, u]
   6:         /* invariant:x[l+1...m] < x[l] &&
   7:                      x[m+1...u] >= x[l]*/
   8:         if x[i]
   9:             swap(++m, i)
  10:     swap(l, m)
  11:     qsort1(l, m-1)
  12:     qsort1(m+1, u)
  13:             

缺点:考虑到如果输入元素全部相等的情况,上面的算法退化为O(N^2),所以使用下面的算法

方法二(从数组的两端开始扫描):

 
   1: void qsort3(l, u)
   2:     if l>=u  
   3:         return
   4:     t = [l]; i=l; j=u+1;
   5:     loop:
   6:         do i++ while i<=u && x[i]
   7:         do j-- while x[j]>t;
   8:         if i>j
   9:             break;
  10:         swap(i, j)
  11:     swap(l, j)
  12:     qsort3(l, j-1)
  13:     qsort3(j+1, u)

优化,考虑到小数组的情况下,插入排序效率更高,结合qsort3与isort3得到qsort4

   1: void qsort4(l, u)
   2:     if l-u <= cutoff
   3:         return ;
   4:     t = x[l]; i=l; j=u+1;
   5:     loop:
   6:         do i++; while i<=u && x[i]
   7:         do j--; while x[i]>t;
   8:         if i>j
   9:             break;
  10:         temp = x[i]; x[i] = x[j]; x[j]=temp;
  11:     swap(l, j)
  12:     qsort4(l, j-1)
  13:     qsort4(j+1, u)

http://www.niftyadmin.cn/n/739488.html

相关文章

(ZZ)三大WEB服务器对比分析(apache ,lighttpd,nginx)

一&#xff0e;软件介绍(apache lighttpd nginx)1. lighttpdLighttpd是一个具有非常低的内存开销&#xff0c;cpu占用率低&#xff0c;效能好&#xff0c;以及丰富的模块等特点。lighttpd是众多OpenSource轻量级的web server中较为优秀的一个。支持FastCGI, CGI, Auth, 输出压…

(ZZ)设计高性能网站架构-LLMP

在网站架构设计中&#xff0c;大家一定对 LAMP (Linux Apache Mysql Php) 不陌生。LAMP确实是一个非常优秀的架构&#xff0c;秉承着自由&#xff0c;开放&#xff0c;高效&#xff0c;易用的设计理念。但是&#xff0c;本文不打算探讨LAMP&#xff0c;网上有很多介绍LAMP的资料…

php访问文件,不可写

在php代码中&#xff1a; <?phpif(is_writeable($file_name)){//....}?> 这里file_name已经设置权限为777.但是还是不可写&#xff0c;查资料&#xff0c;问题为SELinux配置的问题&#xff0c;将SELinux关闭后问题解决。 SELinux关闭办法为&#xff1a; 修改/etc/s…

3G核心网技术揭秘 CS PS IMS

1、3种3G体制并存&#xff1a;WCDMA CDMA2000 TD-SCDMA GSM----- WCDMA 因为GSM使用早&#xff0c;普及程度高&#xff0c;所以WCDMA得到广泛的支持。 2G/2.5G CDMA-CDMA2000 所以实现2G/2.5G到3G的平滑过渡是其最大的优势。目前主要有美国、韩国、日本、巴西等国部署…

OSS库对频率访问的控制

通过学习&#xff0c;让我们留下点什么&#xff0c;知其然&#xff0c;知其所以然。 综述&#xff0c;采用共享内存的方法&#xff0c;记录每个IP、QQ号的超时前的访问时间、次数&#xff0c;然后定时更新记录&#xff0c;从而达到控制。源代码在local_access_limit.h 与 local…

#pragma pack(整理)

目录 一、n字节的对齐方式 二、#pragma pack(n) 对齐用法详解 编辑本段 一、n字节的对齐方式 VC对结构的存储的特殊处理确实提高CPU存储变量的速度&#xff0c;但是有时候也带来了一些麻烦&#xff0c;我们也屏蔽掉变量默认的对齐方式&#xff0c;自己可以设定变量的对齐方式。…

C++中int到string的转换

2009-09-18 15:371. 1、int sprintf( char *buffer, const char *format [, argument] ... ); <stdio.h>例如&#xff1a;Cpp代码int ss; char temp[64]; string str; ss 1000; sprintf(temp, "%d", ss); string s(temp); //调用st…

重构学习笔记

何时重构&#xff1a; 1、不用留出大块的时间来重构&#xff0c;只要编码过程中进行重构 2、事不过三 3、添加功能的时候&#xff0c;A、为了让代码更容易理解 B、为了更容易添加一些功能&#xff0c;让代码结构更具有弹性 4、修真bug时重构&#xff0c;重构让代码更清晰&a…