分享
 
 
 

求出一列数中的“逆序对”

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

求出一列数中的“逆序对”的个数;所谓“逆序对”就是指数的大小与其在序列中的顺序相反的一对数;例 如:<3,4,2,1,3>中“逆序对”有<3,2>,<3,1>,<4,2>,<4,1>,<4,3>这5个;要求时间复杂度为O(nlogn);

#include <stdio.h>

void PrintTheRel(int i, int j);

void Sort(int Array[100], int end);

void GetTheRel(int Front[50],int len1, int Back[50], int len2);

void GetResult(int bundary, int source[100], int low, int high);

void main()

{

int Source[100];

int temp, length, times;

printf("Please enter the length:");

scanf("%d", &length);

printf("\nPlease enter the elements:");

for (temp=0; temp < length; temp++)

scanf("%d", &Source[temp]);

times = (int)(length/2);// 求界限

GetResult(times, Source, 0, length-1);

}

///////////////////////////////////////////////////////////////////////

//

// 函数名 : GetResult

// 功能描述 : 通过递归算法实现数列逆序列的求解

// 参数 : int bundary 二分法中涉及的分界点

// 参数 : int source[100] 一个待求序列

// 参数 : int low 序列的开始坐标

// 参数 : int high 序列的最后坐标

// 返回值 : void

//

///////////////////////////////////////////////////////////////////////

void GetResult(int bundary, int source[100], int low, int high)

{

int i,k=0;

int Front[50], Back[50];

if(high-low < 1) /*假如只有一个数就弹出递归堆栈 */

return;

else

{

for(i=low; i < bundary; i++)

Front[k++] = source[i];/*得到一个前一段的临时的数组 */

k=0;

for(i=bundary; i <= high; i++)

Back[k++] = source[i]; /*得到一个后一段的临时的数组 */

Sort(Front, bundary-1-low);/*对前一段进行排序 */

Sort(Back, high-bundary); /*对后一段进行排序 */

// 得到一组逆序对,这是求已经分好界的两边界的逆序对关系

GetTheRel(Front, bundary-low, Back, high - bundary + 1);

// 递归求左半部分

GetResult((int)((bundary-low +1) / 2)+low, source, low, bundary-1);

// 递归求右半部分

GetResult((int)((high-bundary+1) / 2)+bundary, source, bundary, high);

}

}

///////////////////////////////////////////////////////////////////////

//

// 函数名 : GetTheRel

// 功能描述 : 得到已经分成两半时的逆序对

// 参数 : int Front[50] 前一部分的己排序序列

// 参数 : int len1 前一个序列的长度

// 参数 : int Back[50] 后一部分的已排序序列

// 参数 : int len2 后一个序列的长度

// 返回值 : void

//

///////////////////////////////////////////////////////////////////////

void GetTheRel(int Front[50], int len1, int Back[50], int len2)

{

int i=0, j=0, k;

// 通过一次扫描可以将两个部分的逆序对全找出来

while ((i<len1) && (j <len2))

{

while (Front[i] > Back[j] && (i<len1) && (j <len2))

{

// 因为己经按递增排好序的所以将前半部分i下面的全部输出

for(k=i; k<len1;k++)

PrintTheRel(Front[k], Back[j]);

j++;/*当输出之后,后半部分指针加一 */

}

i++; /*前半部分没有比当前后半部分的值大将加一 */

}

}

///////////////////////////////////////////////////////////////////////

//

// 函数名 : Sort

// 功能描述 : 现在只是为了方便采用的是冒泡排序,可以采用O(nlogn)的算法。

// 参数 : int Array[100] 需要排序的数组

// 参数 : int end 数组默认从0开始,到end结束

// 返回值 : void

//

///////////////////////////////////////////////////////////////////////

void Sort(int Array[100], int end)

{

int i, j, temp;

// 自己认为这样的冒泡写法最清晰

for (i=end; i >0; i--)

for (j=0; j < i; j++)

if (Array[j] > Array[j+1])

{

temp = Array[j];

Array[j] = Array[j+1];

Array[j+1] = temp;

}

}

///////////////////////////////////////////////////////////////////////

//

// 函数名 : PrintTheRel

// 功能描述 : 格式打印

// 参数 : int i 参数1

// 参数 : int j 参数2

// 返回值 : void

//

///////////////////////////////////////////////////////////////////////

void PrintTheRel(int i, int j)

{

printf("<%d, %d>\n", i, j);

}

输入输出举例:

Please enter the length:10

Please enter the elements:9 8 7 6 5 4 3 2 1 0

<5, 0>

<6, 0>

<7, 0>

<8, 0>

<9, 0>

<5, 1>

<6, 1>

<7, 1>

<8, 1>

<9, 1>

<5, 2>

<6, 2>

<7, 2>

<8, 2>

<9, 2>

<5, 3>

<6, 3>

<7, 3>

<8, 3>

<9, 3>

<5, 4>

<6, 4>

<7, 4>

<8, 4>

<9, 4>

<7, 5>

<8, 5>

<9, 5>

<7, 6>

<8, 6>

<9, 6>

<8, 7>

<9, 7>

<9, 8>

<6, 5>

<3, 0>

<4, 0>

<3, 1>

<4, 1>

<3, 2>

<4, 2>

<4, 3>

<2, 0>

<2, 1>

<1, 0>

Press any key to continue

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有