笔画排序

2023-11-20 18:08
文章标签 排序 笔画

本文主要是介绍笔画排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

笔画排序
客户需要按姓氏笔画排序,无从下手,从CSDN查了点资料,在这里暂存一下:

方式一: SQL SERVER里面用T-SQL排序
CREATE   TABLE   [ t4 ]  (
    
[ a ]   [ char ]  ( 10 ) COLLATE Chinese_PRC_Stroke_ci_as
ON   [ PRIMARY ]
GO
insert   into  t4  values ( ' ' )
insert   into  t4  values ( ' ' )
insert   into  t4  values ( ' ' )
insert   into  t4  values ( ' ' )
insert   into  t4  values ( ' ' )
select   *   from  t4  order   by  a
a          
-- -------- 
一        
乙        
二        
十        


方式二:自己建立一个笔画排序数据表,然后每次查这个表来排序:
我有一段delphi程序,各位看看然后一起研究研究,再给出一个好的见意。
(抄自大富翁:

在信息处理中,常会遇到对中文信息按某种要求进行排序,例如对姓名按姓氏笔划排
序。而中文信息的排序较英文信息的排序要复杂许多,ASC II编码的有序性大大方便
英文信息排序的实现,那么要实现中文信息的按笔划排序,就得对中文信息进行重新
编码,这里的编码是指将汉字的内码信息转换为汉字按笔划排序的序号信息,新生成
的编码信息可按ASC II前后次序进行排序,从而实现汉字信息的姓氏笔划排序。

  为了实现汉字信息按姓氏笔划排序,首先需要创建一个全部汉字信息按姓氏笔划
排序的文本文件,然后根据该文本文件的汉字笔划排序的序号信息建立汉字--笔划编
码数据库文件,那么对指定的汉字信息字符串按汉字--笔划编码表转换成为按笔划排
序汉字的编码字符串,只需对编码字符串进行排序,就可实现汉字信息按笔划排序的
目的。
  以Dephi 与SQL Server为例介绍实现上述方法的过程:
  第一步、要创建一个全部汉字信息按姓氏笔划排序的文本文件,可以利用
Microsoft Word 6.0提供的按笔划排序的功能。先用任何一种熟悉的高级编程语言编
写一段能生成全部汉字内码的小程序(别忘了一个汉字一行),用来生成一个按姓氏笔
划排序的文本文件。然后在Word中打开该文件,并选择"表格/排序文字[T]..."这一
菜单项,将弹出一个对话框,这时只需将排序依据的类型设为"笔划"后按"确定"按
钮,那么就可以得到一份按姓氏笔划排序的全部汉字的文本文件。
  第二步:建立汉字--笔划编码数据库文件
  最简单的实现方法是用数据库直接记录汉字信息及其它的序号,从而形成编码表
文件。中文系统中编码汉字的总数大约7000个左右,那么就意味着序号需以长度为4
字节的字符串形式存放,才能保证汉字排序的统一性、可靠性。对于一个5个汉字的字
串而言,就得附加20字节的编码信息用于笔划排序。为了节约存贮空间,可采用百进
制编码方式表示汉字的序号。因为两位百进制数可以表示十进制数的范围是0~9999,
那么只需用两个字符用来分别存放百进制数的第一位和第二位,就可以表示任何一个
汉字的序号,而且这种编码显示是有序的(因为ASCII码是有序的)。同样的一个5个
汉字的字串现在只需附加一个10字节的编码信息用于笔划排序,比起上一种方法,采
用百进制编码方式可节约一半的存贮空间,尤其当数据库需排序的中文信息量较大,
做这样的节约是非常值得的。
  汉字--笔划编码数据库文件:Hzcodedb
  其结构为:

  HZ CHAR 2

  HZCODE CHAR 2

  {建立汉字--笔划编码表}

  hzsrc:Ttable;{按姓氏笔划排序的全部汉字信息文本文件,在Delphi 中可将文
本文件按Table处理}

  hzcodedb:Ttable; // 需生成的汉字--笔划编码数据库

  var

  tmp1,tmp2:string;

  i,k,j:integer;

  begin

  hzsrc.open;

  hzcoded8b.open;

  i:=0;

  tmp:='';tmp1:='';

  Hzsrc.first;

  while not HzSrc.eof do

  begin

  i:=i+1;

  k:=(i div 100);

  tmp1:=char(k+23); //first char

  j:=i-k*100;

  tmp2:=char(j+23); //second char

  tmp:=tmp1+tmp2;

  hzcodedb.append;

  hzcodedb.edit;

  hzcodedb['hz']:=hzsrc['field1'];

  hzcodedb.fieldbyname('hzcode').asstring:=tmp;

  hzcodedb.post;

  hzsrc.next;

  end;

  hzcodedb.close

  hzsrc.close;

  end;

  第三步:建立函数HZconvert( hzstring ),将指定的汉字信息字符串hzstring
转换成为按笔划排序汉字的编码字符串。

  Fuction HZconvert( hzstring: string ) : string ;

  var

  hzorder:string;

  tmp:string;

  i,startindex:integer;

  begin

  i:=length(hzstring);

  startindex:=1;

  hzorder:='';

  while (startindex<=i) do

  begin

  tmp:=copy(hzstring,startindex,2);

  startindex:=startindex+2;

  if hzcodedb.findKey([tmp]) then

  hzorder:=hzOrder+hzcodedb['hzorder']

  else

  hzorder:=hzOrder+'zz';

  end; // end of while

  HZconvert:=hzorder;

  end;// end of function

  在开发应用程序的过程中,以姓名的姓氏笔划排序为例,介绍HZconvert函数使
用。

  在数据库结构中,应包括以下的两项:

  姓名(NAME) VARCHAR 30

  姓名编码(NAMEORDER) VARCHAR 30

  VARCHAR是可变长字符串类型,定义姓名为VARCHAR类型是考虑到姓名的长短不
一,为了能既节约空间,又可以输入较长的姓名,而定义姓名为VARCHAR类型。

  Delphi中只需在TTABLE元件的BeforePost 事件中加入以下的代码就可生成姓名
的笔划编码:

  table1['nameorder']:=HZconvert(table1['name']);

  数据库内容建立完毕后,设置NameOrder为Index,就实现了姓名的按姓氏笔划排
序。)

 

这篇关于笔画排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/396456

相关文章

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Python中lambda排序的六种方法

《Python中lambda排序的六种方法》本文主要介绍了Python中使用lambda函数进行排序的六种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1.对单个变量进行排序2. 对多个变量进行排序3. 降序排列4. 单独降序1.对单个变量进行排序

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

hdu 1285(拓扑排序)

题意: 给各个队间的胜负关系,让排名次,名词相同按从小到大排。 解析: 拓扑排序是应用于有向无回路图(Direct Acyclic Graph,简称DAG)上的一种排序方式,对一个有向无回路图进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u 在v 的前面。该序列说明了顶点表示的事件或状态发生的整体顺序。比较经典的是在工程活动上,某些工程完成后,另一些工程才能继续,此时

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

【软考】希尔排序算法分析

目录 1. c代码2. 运行截图3. 运行解析 1. c代码 #include <stdio.h>#include <stdlib.h> void shellSort(int data[], int n){// 划分的数组,例如8个数则为[4, 2, 1]int *delta;int k;// i控制delta的轮次int i;// 临时变量,换值int temp;in

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

鸡尾酒排序算法

目录 引言 一、概念 二、算法思想 三、图例解释 1.采用冒泡排序:   2.采用鸡尾酒排序:  3.对比总结 四、算法实现  1.代码实现  2.运行结果 3.代码解释   五、总结 引言 鸡尾酒排序(Cocktail Sort),也被称为双向冒泡排序,是一种改进的冒泡排序算法。它在冒泡排序的基础上进行了优化,通过双向遍历来减少排序时间。今天我们将学习如何在C