全分!这个多关键字,每个关键字分别用折半插入排序后,结果很扭曲啊快考试了啊小弟我还在编程
全分求助!这个多关键字,每个关键字分别用折半插入排序后,结果很扭曲啊!快考试了啊!我还在编程
下面是代码!如果你不想看代码,可以听完描叙。要给记录排序,我想得到的结果是记录由小到大排列,每条记录有5个关键字。关键字1的地位>关键字2的地位>关键字3的地位>关键字4的地位>关键字5的地位。我用折半排序的方法,分别对记录排五次序。
结果的到的排序结果是记录的顺序是关键字1由小到大排列,关键字2由大到小排列。。。。以此类推。
这是为什么?
我想得到的结果是记录由小到大排列
------解决方案--------------------
貌似应该先用关键字1排序一遍~
然后再对其中关键字1相同的条目中使用关键字2排序
再对其中关键字2相同的再使用关键字3以此类推
你是每次都对数据按照不同关键字排序了吧?
------解决方案--------------------
如果可以用STL,那么这个问题是很容易解决的。俺最近刚好做过类似的事情,而且各关键字的排序可以独立地进行升降排序,所要做的事情就是自己实现一个comparator。
comparator写法的大致思路是这样的:
1. 首先比较第一个关键字。如果两者不等就直接返回两者比较的结果,当然如果是反序的话,返回的结果也需要反过来。如果两者相等,则比较两者的第二个关键字。
2. 重复1。写成递归或者循环都可以。
------解决方案--------------------
------解决方案--------------------
应该从低级往高级排序,即从关键字5,4,3,2,1排序
------解决方案--------------------
如158,234,352,456,216
从小到大排序
先从个位数排序的话,同一级别时(10位是一样大的情况下)个位数是按照从小到大排的
以此类推
这种方法能全部排好序
------解决方案--------------------
将if (RecArray[r[0]].key[key_index]<=RecArray[r[m]].key[key_index])改为
if (RecArray[r[0]].key[key_index]<RecArray[r[m]].key[key_index])才是稳定的
下面是代码!如果你不想看代码,可以听完描叙。要给记录排序,我想得到的结果是记录由小到大排列,每条记录有5个关键字。关键字1的地位>关键字2的地位>关键字3的地位>关键字4的地位>关键字5的地位。我用折半排序的方法,分别对记录排五次序。
结果的到的排序结果是记录的顺序是关键字1由小到大排列,关键字2由大到小排列。。。。以此类推。
这是为什么?
我想得到的结果是记录由小到大排列
- C/C++ code
//开始进行5趟插入排序 for (key_index=NUM_OF_KEY-1;key_index>=0;--key_index) { for (i=2;i<recnum+1;++i) { r[0]=r[i]; low=1;high=i-1; while (low<=high) { m=(low+high)/2; if (RecArray[r[0]].key[key_index]<=RecArray[r[m]].key[key_index]) { high=m-1; } else low=m+1; }//while for (j=i-1;j>=high+1;--j) { r[j+1]=r[j]; //记录后移 } r[high+1]=r[0]; }//for }//for
------解决方案--------------------
貌似应该先用关键字1排序一遍~
然后再对其中关键字1相同的条目中使用关键字2排序
再对其中关键字2相同的再使用关键字3以此类推
你是每次都对数据按照不同关键字排序了吧?
------解决方案--------------------
如果可以用STL,那么这个问题是很容易解决的。俺最近刚好做过类似的事情,而且各关键字的排序可以独立地进行升降排序,所要做的事情就是自己实现一个comparator。
comparator写法的大致思路是这样的:
1. 首先比较第一个关键字。如果两者不等就直接返回两者比较的结果,当然如果是反序的话,返回的结果也需要反过来。如果两者相等,则比较两者的第二个关键字。
2. 重复1。写成递归或者循环都可以。
------解决方案--------------------
------解决方案--------------------
应该从低级往高级排序,即从关键字5,4,3,2,1排序
------解决方案--------------------
如158,234,352,456,216
从小到大排序
先从个位数排序的话,同一级别时(10位是一样大的情况下)个位数是按照从小到大排的
以此类推
这种方法能全部排好序
------解决方案--------------------
将if (RecArray[r[0]].key[key_index]<=RecArray[r[m]].key[key_index])改为
if (RecArray[r[0]].key[key_index]<RecArray[r[m]].key[key_index])才是稳定的