快速排序的若干源码剖析(包括JAVA、Qt、算法导论)
快排:快速排序,难度不是太大,但是是我经常把玩的小代码之一,引用快排代码创始人的一句话“要不是简练又明显没有错误,要不是复杂没有明显的错误”
起因:
主要是前一阵看刘汝佳的《算法艺术与信息学竞赛》P73页,碰巧我又亲手写了一遍那书上的测试了一下,发现竟然是错误的,然后我又测试了一下我以前写的快排的代码,发现也是错误的ORZ。然后我就翻了一下能找到的快排的源码。包括Qt、JAVA、算法导论,顺手用了一下系统的快排
简单说下
系统的快排 很快
Qt 绝对是另类的代码
JAVA 很符合一般人能想到的优化
算法导论 简练又明显没有错误
刘汝佳的《算法艺术与信息学竞赛》P73页
/*
*选自刘汝佳的《算法艺术与信息学竞赛》P73页,此为书上的算法,经测试是 错误的快排
*/
#include<stdio.h>
long a[5];
long p(long l,long r){//可以发现这里面有点错误
long x=a[l],i=l-1,j=r+1,t;
while(1){
do{//这种语句会出现很棘手的情况,使不该划分的被跳过去了
--j;
}
while(a[j]>x);
do{
++i;
}
while(a[i]>x);
if(i<j){
t=a[i];a[i]=a[j];a[j]=t;
}
else{
return j;
}
}
}
void q(long l,long r){
long n;
if(l<r){
n=p(l,r);
q(l,n);
q(n+1,r);
}
}
int main(){
a[0]=5 ;
a[1]=3 ;
a[2]=2 ;
a[3]=4 ;
a[4]=1 ;
q(0,4);
int i;
for(i=0;i<5;++i){
printf("%i ",a[i]);
}
return 0;
}
直接用系统快排的速度惊人,并且也是编程的好习惯
/*
*使用系统的快排,测试时会出现惊人的快
*/
#include<cstdio>
#include<cstdlib>
using namespace std;
int compare(const void*, const void*);
int main() {
int numsLength=5;
int *nums=new int[numsLength];
nums[0]=5;
nums[1]=7;
nums[2]=2;
nums[3]=4;
nums[4]=1;
for (int i=0;i<numsLength;++i) {
printf("%i ",nums[i]);
}
printf("\n")
相关文档:
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"\@宋体" ......
最近研究了下分页,做个总结。
1)数据库操作类,做简单封装 DB.java
package Test;
import java.sql.*;
public class DB {
// 加载驱动
static {
try {
Class.f ......
一、java访问中文Oracle数据库上连接的US7ASCII数据库
1、读方法
public String convertLink_DB(String s) {
if(s != null){
try{
byte[] b = s.getBytes();
for(int i=0; i<b.length; i++){
b[i] ......
学习Java必看 - JAVA代码编写的30条建议
(1) 类名首字母应该大写。字段、方法以及对象(句柄)的首字母应小写。对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母。例如:
ThisIsAClassName
thisIsMethodOrFieldName
若在定义中出现了常数初始化 ......