摘要:
#include#includetypedef struct list{ int data; struct list*next;}List;List*insert_list_2nd(List*head,int data);List*insert_list_last(List*head,int data);List*insert_list_order(List*head,int data);void print_list(List*head);List*delete_list(List*head,int value);int main(){ List*head=NULL; int i;// f. 阅读全文
摘要:
//链表有序插入和删除最重要的是预判,就是判断下一个是否满足要求,因为如果只是判断当前,那么当你找到要操作的节点时,已经过了指向该节点的指针//删除的时候注意释放空间#include#includetypedef struct list{ int data; struct list*next;}List; void insert_list_2nd(List*head,int data);//表头插入 void insert_list_last(List*head,int data);//表尾插入 void insert_list_order(List*head,int data);//有序.. 阅读全文
摘要:
这是我根据下面黑体字总结的:深度优先搜素算法:不全部保留结点,占用空间少;有回溯操作(即有入栈、出栈操作),运行速度慢。广度优先搜索算法:保留全部结点,占用空间大; 无回溯操作(即无入栈、出栈操作),运行速度快。通常 深度优先搜索法不全部保留结点,扩展完的结点从数据库中弹出删去,这样,一般在数据库中存储的结点数就是深度值,因此它占用空间较少。所以,当搜索树的结点较多,用其它方法易产生内存溢出时,深度优先搜索不失为一种有效的求解方法。 广度优先搜索算法,一般需存储产生的所有结点,占用的存储空间要比深度优先搜索大得多,因此,程序设计中,必须考虑溢出和节省内存空间的问题。但广度优先搜索法一般无回.. 阅读全文
摘要:
一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack):由编译器(Compiler)自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字常量区 — 常量字符串就是放. 阅读全文
摘要:
(从 逻辑结构 和 内存存储 方面分析)A 从逻辑结构来看A-1. 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。A-2. 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)B 从内存存储来看B-1. (静态)数组从栈中分配空间, 对于程序员方便快速,但是自由度小B-2. 链表从堆中分配空间, 自由度大但是申请管理比较麻烦. 阅读全文
摘要:
一,复杂度:O(n log n)基本思想:通过一趟排序讲待排序记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。#include int Partition(int *a, int low, int high){ int pivotkey = a[low]; //注意左右分别对应传入的low high while(low=pivotkey)//中枢要比右边的小 --high; a[low]=a[high];//发现一个比中枢小的,移到左边 ... 阅读全文
摘要:
冒泡排序已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]与a[4],依此类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,依此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。优点:稳定,比较次数 阅读全文
摘要:
选择排序已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[1]与a[3]的值,若a[1]大于a[3]则交换两者的值,否则不变。再比较a[1]与a[4],依此类推,最后比较a[1]与a[n]的值。这样处理一轮后,a[1]的值一定是这组数据中最小的。再将a[2]与a[3]~a[n]以相同方法比较一轮,则a[2]的值一定是a[2]~a[n]中最小的。再将a[3]与a[4]~a[n]以相同方法比较一轮,依此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。例如定义数组a[]= 阅读全文
摘要:
插入排序:的基本思想是:每次将一个特排序的记录,按其关键字大小插入到前面已经拍好序的子文件中的适当位置,直到全部记录插入完成为止。两种排序的算法:直接插入排序:希尔排序:直接插入排序:直接插入排序(Straight Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。改进的方法 一种查找比较操作和记录移动操作交替地进行的方法。 具体做法: 将待插入记录R[i]的关键字... 阅读全文
摘要:
这种快速排序的思路是:首先以a[start]为轴,不停得从数组的两端开始比较。从最右端开始,如果有比a[start]小的,那么赋值a[i];从最左端开始,如果有比a[start]大的,那么赋值a[j],以此往复,渐渐有序;注意的是递归跳出的条件,只有一个数就不需要排序,即start>=end#include#include#define N 1000000int array[N];void init_array(int a[],int n);void print_array(int a[],int n);void quick_sort(int a[],int start,int end) 阅读全文