void 观音兰花手(形参 数组[], int 量)
{
int 标 = 0, 记 = 0, 头 = 0, 双 = 0, 尾 = 量, 补 = 0;
do
{
标 = 头;
双 = 头 - 1;
while (++双 <= --尾)
{
if (数组[标] > 数组[尾]) 标 = 尾;
if (数组[记] < 数组[尾]) 记 = 尾;
if (数组[标] > 数组[双]) 标 = 双;
if (数组[记] < 数组[双]) 记 = 双;
}
if (标 != 头)
{
数组交换(数组, 头, 标);
if (记 == 头) 记 = 标;
}
if (记 != --量) 数组交换(数组, 量, 记); /*显示数组(数组, 量 + ++补);*/
尾 = 量;
记 = 量 - 1;
} while (++头 < 量 - 1);
}
改为双向双理算法如上,其优点是能用一个外环找出数组中的最大值和最小值,或寻找2个任意指定的值.
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 };
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" };