顺序表之就地逆置算法

 1 #include<stdio.h>
 2 #define MAX 10
 3 typedef int ElementType;
 4 int length=0;
 5 int value;
 6 typedef struct {
 7     ElementType i;
 8     int length;
 9     ElementType data[MAX];
10 }Sorder;
11 int main(){
12     Sorder L;
13     //往顺序表中塞入数据
14     for(int i=0;i<MAX;i++){
15         L.data[i]=i+1;
16         L.length++;
17     }
18     //主要的算法代码,进行交换
19      for(int i=0;i<(L.length)/2;i++){
20          value=L.data[i];
21          L.data[i]=L.data[L.length-i-1];
22          L.data[L.length-i-1]=value;
23     }
24     //输出即为逆序
25     for(int i=0;i<MAX;i++){
26         printf("%d",L.data[i]);
27     }
28 }

 

Q:设计一个高效的算法,将顺序表的所有元素逆置,要求算法的空间复杂度是O(1);

A:此算法复杂度对应王道练习中第一章第二题,算法的主要思想如下:

(1)扫描顺序表的前半部分元素,对于L.data[i](i大于等于0小于L.length-1)

(2)将其余后半部分对应元素L.data[L.length-i+1]进行交换。

总结:其实主要在于对第二个for循环的理解,这也是核心代码,借助辅助变量value进行一个交换 ,这种在很多地方是很常见的。

原文地址:https://www.cnblogs.com/yjm5/p/9189103.html

时间: 2024-07-29 13:09:28

顺序表之就地逆置算法的相关文章

【C语言编程练习】7.1 线型表就地逆置

写在前面的话:直接从第5章跳到了第7章数据结构的趣题,原因是前面的数学趣题做久了,会觉得稍许疲倦,所以想“变个口味”,以后数学趣题和数据结构混合着练习. 1. 题目要求 编写一个函数,实现顺序表的就地逆置,也就是说利用原表的存储空间,将顺序表(a1,a2,a3,...,an)逆置为(an,an-1,...,a2,a1) 2. 题目分析 oh!太久没有看过数据结构的东西了,感觉非常的不习惯,脑子一片空白呢! 顺序表应该可以如下简单的描述 a->b->c->d->... 这里先简单复习

SDUT 3327 顺序表应用4:元素位置互换之逆置算法

顺序表应用4:元素位置互换之逆置算法 Time Limit: 10 ms Memory Limit: 570 KiB Problem Description 一个长度为len(1<=len<=1000000)的顺序表,数据元素的类型为整型,将该表分成两半,前一半有m个元素,后一半有len-m个元素(1<=m<=len),设计一个时间复杂度为O(N).空间复杂度为O(1)的算法,改变原来的顺序表,把顺序表中原来在前的m个元素放到表的后段,后len-m个元素放到表的前段.注意:先将顺序

6-1 顺序表创建和就地逆置 (10 分)

本题要求实现顺序表的创建和就地逆置操作函数.L是一个顺序表,函数ListCreate_Sq(SqList &L)用于创建一个顺序表,函数ListReverse_Sq(SqList &L)是在不引入辅助数组的前提下将顺序表中的元素进行逆置,如原顺序表元素依次为1,2,3,4,则逆置后为4,3,2,1. 函数接口定义: Status ListCreate_Sq(SqList &L); void ListReverse_Sq(SqList &L); 裁判测试程序样例: //库函数

数据结构与算法-链表就地逆置

链表操作,单链表就地逆置 void Inverse(LinkList &L) { LNode *p, *q; p = L->next; /*记录第一个结点地址*/ L->next = NULL; /*把链表设置成空表*/ while (p != NULL) /*依次按头插法将各结点插入,就实现了逆置*/ { q = p; /*用q记录待插入结点地址*/ p = p->next; /*用p记录待插入结点的后继结点地址*/*/ q->next = L->next; /*将

单链表就地逆置

题目:有一个线性表(a1,a2,a3,...,an),采用带头节点的单链表L存储,设计一个算法将其就地逆置,线性表变为(an,...a3,a2,a1).所谓"就地"指辅助存储空间为O(1). 解题思路: 如果是顺序存储的话,我们很容易想到解题思路,利用1个辅助变量让第1个元素与第n个元素交换,然后再利用这个辅助变量让第2个元素与第n-1个元素交换,...最后利用这个辅助变量让第n/2个元素与第n+1-n/2个元素交换. 如果不要求"就地"的话,可以创建一个n个元素辅

单链表就地逆置(Java版)

题目:有一个线性表(a1,a2,a3,...,an),采用带头节点的单链表L存储,设计一个算法将其就地逆置,线性表变为(an,...a3,a2,a1).所谓"就地"指辅助存储空间为O(1). 解题思路: 如果是顺序存储的话,我们很容易想到解题思路,利用1个辅助变量让第1个元素与第n个元素交换,然后再利用这个辅助变量让第2个元素与第n-1个元素交换,...最后利用这个辅助变量让第n/2个元素与第n+1-n/2个元素交换. 如果不要求"就地"的话,可以创建一个n个元素辅

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 一:稀疏矩阵的三元组顺序表数据结构 typedef int ElemType; typedef struct { intx, y;  //该非零元素的行下标和列下标 ElemTypee; //该非零元素的值 } Triple; typedef struct { Tripledata[MAXSIZE]; //非零元素三元组顺序表 intmu, nu, t

DS之顺序表实现输入数据逆置

实现输入数据逆置和顺序表实现排序是两个极其相似的过程,因此使用的顺序表的基本操作也是一样的:0基本操作前的准备,1初始化顺序表,6向顺序表插入数据元素. 要想实现输入数据元素的逆置还需要一个逆置函数,逆置函数在C++,C#语言中早已接触过,因此不陌生,记得在做大量的C++的程序代码补充的大题就写过不下数十遍,挺简单的掌握技巧,就是你输入数据的个数的一半,前后进行交换,因此逆置函数的代码为: <span style="font-size:18px;">//逆置函数 void

用C语言实现顺序表的插入和删除算法

什么是线性表? 线性表是n个数据元素的有限序列.根据线性表的显现方式,线性表又分为顺序表(数据元素在内存中的存储空间是连续的)和链表(数据元素在内存中的存储空间是不连续的). 线性表如何用C语言实现?线性表可以进行哪些操作? 在C语言中,线性表通过结构体的方式来实现.结构体中定义了线性表的存储空间地址,当前长度,和当前分配的存储容量.操作包含在指定位置插入某一元素.删除指定元素.查找指定的元素等.在这里重点介绍插入和删除算法. 下面就是关于这一部分内容的陈述. 线性表的C语言实现 需要先定义好的