"海潮音"排序算法之观音兰花手双理算法

来源:互联网 发布:纺织设计软件 编辑:程序博客网 时间:2024/05/17 03:57

void 观音兰花手(形参 数组[], int 量){int 标 = 0, 记 = 0, 头 = 0, 双 = 0, 尾 = 量, 补 = 0;do{标 = 头;双 = 头 - 1;while (++双 <= --尾){if (数组[标] > 数组[尾]) 标 = 尾;if (数组[记] < 数组[尾]) 记 = 尾;if (数组[标] > 数组[双]) 标 = 双;if (数组[记] < 数组[双]) 记 = 双;}if (标 != 头){数组交换(数组, 头, 标);if (记 == 头) 记 = 标;}if (记 != --量) 数组交换(数组, 量, 记); /*显示数组(数组, 量 + ++补);*/尾 = 量;记 = 量 - 1;} while (++头 < 量 - 1);}
改为双向双理算法如上.

void 观音兰花手(形参 数组[], int 量){int 标 = 0, 记 = 0, 头 = 0, 尾 = 量;do{标 = 头;while (头 < --尾){if (数组[标] > 数组[尾]) 标 = 尾;if (数组[记] < 数组[尾]) 记 = 尾;}if (标 != 头){数组交换(数组, 头, 标);if (记 == 头) 记 = 标;}if (记 != --量) 数组交换(数组, 量, 记);尾 = 量;记 = 量 - 1;} while (++头 < 量 - 1);};

void 快速排序(int *数组, long 低, long 高){long i, j;int x; static int 量 = 高 + 1;i = 低;j = 高;x = 数组[i];while (i < j){while (数组[j] >= x && i<j) j--;数组[i] = 数组[j];while (数组[i] <= x && i<j) i++;数组[j] = 数组[i];}数组[i] = x; 显示数组(数组, 量);/**/if (i - 低>1) 快速排序(数组, 低, i - 1);if (高 - j>1) 快速排序(数组, j + 1, 高);}

template <class 形参>void 海潮音(形参 数组[], int 量){int 标 = 0, 记 = 0, 头 = 0, 尾 = 量, 补 = 0;形参 转存;do{记 = 标 = 头;/*while (头 < 尾) if (数组[标] > 数组[--尾]) 标 = 尾;else if (头 > 0 && 数组[头 - 1] == 数组[尾]){ 标 = 尾; break; }if (标 != 头) 数组交换(数组, 头, 标);获得最小下标2017.6.6 17:17 特为重复数据跳转*/while (头 < --尾){if (数组[标] > 数组[尾]) 标 = 尾;if (数组[记] < 数组[尾]) 记 = 尾;}if (标 != 头) { 数组交换(数组, 头, 标); if (记 == 头) 记 = 标; }if (记 != --量 && 记 != 头) 数组交换(数组, 量, 记); 显示数组(数组, 量 + ++补);/*如果升序则记在尾,如果降序则记在头而随转,只有当一个数组是等值时,将做无谓的转尾,为此添加判断 && 记 != 头.*/尾 = 量;} while (++头 < 量 - 1);};template <class 形参>void 数组交换(形参 数组[], int 交位, int 换位){形参 转存 = 数组[交位];数组[交位] = 数组[换位];数组[换位] = 转存;}

所谓双理算法:即在一个循环比较中得到最大和最小的2个数据,分别归位于头尾,并向中间缩量进行.

因此,把之上算法改进如下:

此时,想起了观世音菩萨的兰花手,很想用此命名.虽然我现在不知如何为我这算法找权威,不过灵觉告诉我,我这算法已非凡品,从此排序有我.

之上发布的3种算法,都是一蹴而就,尚未精细优化.最后觉得自己之上的话说得早,也大了些,有点不好意思,可是这种想法又不吐不快,只好随想去了,不管之后如何.


之上测试都是在数据交换完成后显示,快排代码如下:

2017-6-11 晚上做了这样一个数组测试:int 数组[] = { 9, 0, 8, 1, 7, 2, 6, 3, 5, 4, 4, 5, 3, 6, 2, 7, 1, 8, 0, 9 };与快排对比如下图示:

一番推敲,稍作调整,可免去一个判断,如下:



 //double 数组[] = { 9.1, 6.2, 3.3, 2.4, 5.5, 8.6, 7.7, 4.8, 10.1, 9.1, 1.9 };
 int 数组[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 10,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 20, 9, 8, 7, 6, 5, 4, 3, 2, 1, 30,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 40, 9, 8, 7, 6, 5, 4, 3, 2, 1, 50,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 60, 9, 8, 7, 6, 5, 4, 3, 2, 1, 70,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 80, 9, 8, 7, 6, 5, 4, 3, 2, 1, 90,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 100, 9, 8, 7, 6, 5, 4, 3, 2, 1, 110,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 120, 9, 8, 7, 6, 5, 4, 3, 2, 1, 130,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 140, 9, 8, 7, 6, 5, 4, 3, 2, 1, 150,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 160, 9, 8, 7, 6, 5, 4, 3, 2, 1, 170,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 180, 9, 8, 7, 6, 5, 4, 3, 2, 1, 190,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 200, 9, 8, 7, 6, 5, 4, 3, 2, 1, 210,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 220, 9, 8, 7, 6, 5, 4, 3, 2, 1, 230,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 240, 9, 8, 7, 6, 5, 4, 3, 2, 1, 250,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 260, 9, 8, 7, 6, 5, 4, 3, 2, 1, 270,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 280, 9, 8, 7, 6, 5, 4, 3, 2, 1, 290,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 300, 9, 8, 7, 6, 5, 4, 3, 2, 1, 310,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 320, 9, 8, 7, 6, 5, 4, 3, 2, 1, 330,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 340, 9, 8, 7, 6, 5, 4, 3, 2, 1, 350,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 360, 9, 8, 7, 6, 5, 4, 3, 2, 1, 370,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 380, 9, 8, 7, 6, 5, 4, 3, 2, 1, 390,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 400, 9, 8, 7, 6, 5, 4, 3, 2, 1, 410,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 420, 9, 8, 7, 6, 5, 4, 3, 2, 1, 430,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 440, 9, 8, 7, 6, 5, 4, 3, 2, 1, 450,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 460, 9, 8, 7, 6, 5, 4, 3, 2, 1, 470,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 480, 9, 8, 7, 6, 5, 4, 3, 2, 1, 490,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 500, 9, 8, 7, 6, 5, 4, 3, 2, 1, 510,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 520, 9, 8, 7, 6, 5, 4, 3, 2, 1, 530,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 540, 9, 8, 7, 6, 5, 4, 3, 2, 1, 550,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 560, 9, 8, 7, 6, 5, 4, 3, 2, 1, 570,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 580, 9, 8, 7, 6, 5, 4, 3, 2, 1, 590,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 600, 9, 8, 7, 6, 5, 4, 3, 2, 1, 610,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 620, 9, 8, 7, 6, 5, 4, 3, 2, 1, 630,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 640, 9, 8, 7, 6, 5, 4, 3, 2, 1, 650,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 660, 9, 8, 7, 6, 5, 4, 3, 2, 1, 670,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 680, 9, 8, 7, 6, 5, 4, 3, 2, 1, 690,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 700, 9, 8, 7, 6, 5, 4, 3, 2, 1, 710,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 720, 9, 8, 7, 6, 5, 4, 3, 2, 1, 730,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 740, 9, 8, 7, 6, 5, 4, 3, 2, 1, 750,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 760, 9, 8, 7, 6, 5, 4, 3, 2, 1, 770,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 780, 9, 8, 7, 6, 5, 4, 3, 2, 1, 790,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 800, 9, 8, 7, 6, 5, 4, 3, 2, 1, 810,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 820, 9, 8, 7, 6, 5, 4, 3, 2, 1, 830,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 840, 9, 8, 7, 6, 5, 4, 3, 2, 1, 850,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 860, 9, 8, 7, 6, 5, 4, 3, 2, 1, 870,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 880, 9, 8, 7, 6, 5, 4, 3, 2, 1, 890,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 900, 9, 8, 7, 6, 5, 4, 3, 2, 1, 910,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 920, 9, 8, 7, 6, 5, 4, 3, 2, 1, 930,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 940, 9, 8, 7, 6, 5, 4, 3, 2, 1, 950,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 960, 9, 8, 7, 6, 5, 4, 3, 2, 1, 970,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 980, 9, 8, 7, 6, 5, 4, 3, 2, 1, 990,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0,
  9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };/**/
 //int 数组[] = { 9, 0, 8, 1, 7, 2, 6, 3, 5, 4, 4, 5, 3, 6, 2, 7, 1, 8, 0, 9 };
 //int 数组[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
 //int 数组[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 //int 数组[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
 //int 数组[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 //int 数组[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };

char 数组[] = { "qwertyuioplkjhgfdsazxcvbnm" };



原创粉丝点击