数据结构--实验

话不多说,直接启动!👌🤣

目录

一、线性表😎

1、建立链表 

 2、插入元素

3、删除特定位置的元素

 4、输出特定元素值的位置

5、输出特定位置的元素值

 6、输出整个链表

 实现

二、栈和队列😘

顺序栈

1、建立顺序栈

2、入栈

3、出栈

4、取栈顶

5、遍历栈

6、判栈空

实现: 

链栈

1、建立链栈

2、入栈

3、出栈

4、取栈顶

5、遍历栈

6、判栈空

实现: 

队列

顺序队列

1、建立顺序队列

2、入队

3、出队

4、求队列长度

5、遍历队列

实现:

链式队列

1、建立链式队列

2、入队

3、出队

4、求队列长度

5、遍历队列

实现:

 三、树和二叉树

实现:

 四、图

实现:

五、查找和排序

 折半查找实现:

快速排序实现: 


 

一、线性表😎

1、建立链表 

#include<iostream>
#include<vector>
using namespace std;
//定义单链表结点结构体 
struct ListNode{int val;ListNode* next;
};
//创建链表
ListNode* CreateList(){ListNode* head = new ListNode();//创建头结点head->next = nullptr;//初始化头结点的next指针为空return head; 
} 
int main(){ListNode* head = CreateList();
}

 2、插入元素

//在链表中插入元素
void Insert(ListNode* head, int i, int val) { // 需要链表,第i个位置,插入val值ListNode* current = head; // 初始化当前结点为头结点while (i-- > 0) { // 循环i次找插入位置current = current->next;}ListNode* newNode = new ListNode();newNode->val = val;newNode->next = current->next;current->next = newNode;
}

3、删除特定位置的元素

//删除特定位置的元素
void Delete(ListNode* head,int index){//需要链表,第i个位置if(index<0)return;ListNode* current = head;for(int i=0;i<index&&current!=nullptr;i++){current=current->next;}if(current==nullptr)return;ListNode* toDelete = current->next;current->next = current->next->next;delete toDelete;
}

 4、输出特定元素值的位置

//输出特定元素值的位置
void PrintValue(ListNode* head, int index) {ListNode* current = head;int position = 0;while (current != nullptr) {if (current->val == index) {cout << "元素值:" << current->val << " 的位置是:" << position << endl;break;}current = current->next;position++;}if (current == nullptr) {cout << "索引超出链表范围" << endl;}
}

5、输出特定位置的元素值

//输出特定位置的元素值
void PrintNodeAtPosition(ListNode* head, int index) {ListNode* current = head;for (int i = 0; i < index && current != nullptr; i++) {current = current->next;}if (current != nullptr) {cout << "元素位置:" << index << ", 值:" << current->val << endl;} else {cout << "索引超出链表范围" << endl;}
}

 6、输出整个链表

//输出整个链表
void PrintList(ListNode* head) {ListNode* current = head;while (current != nullptr) {cout << current->val << " --> ";current = current->next;}cout << "nullptr" << endl;
}

 实现

#include<iostream>
#include<vector>
using namespace std;
//定义单链表结点结构体 
struct ListNode{int val;ListNode* next;
};
//创建链表
ListNode* CreateList(){ListNode* head = new ListNode();//创建头结点head->next = nullptr;//初始化头结点的next指针为空return head; 
} 
//在链表中插入元素
void Insert(ListNode* head, int i, int val) { // 需要链表,第i个位置,插入val值ListNode* current = head; // 初始化当前结点为头结点while (i-- > 0) { // 循环i次找插入位置current = current->next;}ListNode* newNode = new ListNode();newNode->val = val;newNode->next = current->next;current->next = newNode;
}
//删除特定位置的元素
void Delete(ListNode* head,int index){//需要链表,第i个位置if(index<0)return;ListNode* current = head;for(int i=0;i<index&&current!=nullptr;i++){current=current->next;}if(current==nullptr)return;ListNode* toDelete = current->next;current->next = current->next->next;delete toDelete;
}
//从输入读取链表元素并插入
void ReadInputToList(ListNode* head) {cout << "请输入你需要建立的初始链表(只允许实数):" << endl;vector<double> LinkList;double input;while (cin >> input) {LinkList.push_back(input);if(cin.peek() == '\n'){cin.ignore();break;}}int index = 0;for (double value : LinkList) {Insert(head, index++, static_cast<int>(value)); // 将读取的实数转换为整数后插入链表}
} 
//输出特定元素值的位置
void PrintValue(ListNode* head, int index) {ListNode* current = head;int position = 0;while (current != nullptr) {if (current->val == index) {cout << "元素值:" << current->val << " 的位置是:" << position << endl;break;}current = current->next;position++;}if (current == nullptr) {cout << "索引超出链表范围" << endl;}
}//输出特定位置的元素值
void PrintNodeAtPosition(ListNode* head, int index) {ListNode* current = head;for (int i = 0; i < index && current != nullptr; i++) {current = current->next;}if (current != nullptr) {cout << "元素位置:" << index << ", 值:" << current->val << endl;} else {cout << "索引超出链表范围" << endl;}
}
//输出整个链表
void PrintList(ListNode* head) {ListNode* current = head;while (current != nullptr) {cout << current->val << " --> ";current = current->next;}cout << "nullptr" << endl;
}
int main(){ListNode* head = CreateList();ReadInputToList(head);cout<<"1.输出链表中的所有结点"<<endl;PrintList(head);cout<<"2.输出元素25的位置"<<endl;PrintValue(head,25);cout<<"3.输出第5个元素"<<endl;PrintNodeAtPosition(head,5);cout<<"4.在第 3 个元素前插入值为 98 的元素,然后输出链表"<<endl;Insert(head,3,98);PrintList(head);cout<<"5.输出删除第 4 个元素后的链表"<<endl;Delete(head,4);PrintList(head);return 0;
}

二、栈和队列😘

顺序栈

1、建立顺序栈
// 建立顺序栈
struct Stack {int *elem; // 指向动态分配的数组int top; // 栈顶指针int MaxSize; // 栈的最大容量
};// 创建栈
Stack* CreateStack(int MaxSize) {Stack* stack = new Stack();stack->elem = new int[MaxSize];stack->top = -1;stack->MaxSize = MaxSize;return stack;
}
2、入栈
// 入栈
void Push(Stack* stack, int val) {if (stack->top < stack->MaxSize - 1) { // 如果栈未满stack->elem[++stack->top] = val; // 栈顶指针后移并赋值} else {cout << "栈已满,无法入栈" << endl;}
}
3、出栈
// 出栈
int Pop(Stack* stack) {if (stack->top >= 0) { // 如果栈非空return stack->elem[stack->top--]; // 返回栈顶元素并移动栈顶指针} else {cout << "栈为空,无法出栈" << endl;return -1; // 返回-1表示栈空}
}
4、取栈顶
// 取栈顶
int GetTop(Stack* stack) {if (stack->top >= 0) { // 如果栈非空return stack->elem[stack->top]; // 返回栈顶元素} else {cout << "栈为空,无法获取栈顶元素。" << endl;return -1; // 返回-1表示栈空}
}
5、遍历栈
// 遍历栈
void TraverseStack(Stack* stack) {for (int i = 0; i <= stack->top; i++) {cout << stack->elem[i] << " ";}cout << endl;
}
6、判栈空
// 判断栈是否为空
bool IsEmpty(Stack* stack) {return stack->top < 0; // 如果栈顶指针小于0,则栈为空
}
实现: 
#include <iostream>
#include <vector>
using namespace std;// 建立顺序栈
struct Stack {int *elem; // 指向动态分配的数组int top; // 栈顶指针int MaxSize; // 栈的最大容量
};// 创建栈
Stack* CreateStack(int MaxSize) {Stack* stack = new Stack();stack->elem = new int[MaxSize];stack->top = -1;stack->MaxSize = MaxSize;return stack;
}// 入栈
void Push(Stack* stack, int val) {if (stack->top < stack->MaxSize - 1) { // 如果栈未满stack->elem[++stack->top] = val; // 栈顶指针后移并赋值} else {cout << "栈已满,无法入栈" << endl;}
}// 出栈
int Pop(Stack* stack) {if (stack->top >= 0) { // 如果栈非空return stack->elem[stack->top--]; // 返回栈顶元素并移动栈顶指针} else {cout << "栈为空,无法出栈" << endl;return -1; // 返回-1表示栈空}
}// 取栈顶
int GetTop(Stack* stack) {if (stack->top >= 0) { // 如果栈非空return stack->elem[stack->top]; // 返回栈顶元素} else {cout << "栈为空,无法获取栈顶元素。" << endl;return -1; // 返回-1表示栈空}
}// 遍历栈
void TraverseStack(Stack* stack) {for (int i = 0; i <= stack->top; i++) {cout << stack->elem[i] << " ";}cout << endl;
}// 判断栈是否为空
bool IsEmpty(Stack* stack) {return stack->top < 0; // 如果栈顶指针小于0,则栈为空
}// 从输入读取元素并添加
void ReadInputToStack(Stack* stack) {cout << "请输入你需要建立的初始顺序栈(只允许实数):" << endl;vector<double> Arr;double input;while (cin >> input) {Arr.push_back(input);if (cin.peek() == '\n') {cin.ignore();break;}}int index = 0;for (double value : Arr) { // 遍历Arr而不是stackPush(stack, static_cast<int>(value));}
}int main() {int max = 0;cout << "请输入栈的最大容量:" << endl;cin >> max;Stack* stack = CreateStack(max);ReadInputToStack(stack);TraverseStack(stack);return 0;
}

链栈

1、建立链栈
// 定义链栈节点结构体
struct StackNode {int val;StackNode* next;
};// 创建链栈
StackNode* CreateStack() {StackNode* head = new StackNode(); // 创建头节点head->next = nullptr;return head;
}
2、入栈
// 入栈操作
void Push(StackNode* head, int val) {StackNode* newNode = new StackNode{val, nullptr}; // 创建新节点newNode->next = head->next; // 将新节点链接到链表head->next = newNode; // 头节点指向新节点
}
3、出栈
// 出栈操作
int Pop(StackNode* head) {if (head->next == nullptr) {cout << "栈为空,无法出栈。" << endl;return -1; // 返回-1表示栈空}StackNode* temp = head->next; // 临时节点int val = temp->val; // 保存要返回的值head->next = temp->next; // 头节点指向下一个节点delete temp; // 释放临时节点return val; // 返回栈顶元素
}
4、取栈顶
// 获取栈顶元素
int GetTop(StackNode* head) {if (head->next == nullptr) {cout << "栈为空,无法获取栈顶元素。" << endl;return -1; // 返回-1表示栈空}return head->next->val; // 返回栈顶元素
}
5、遍历栈
// 遍历链栈
void TraverseStack(StackNode* head) {if (head->next == nullptr) {cout << "栈为空。" << endl;return;}StackNode* current = head->next; // 从栈顶开始遍历cout << "链栈元素: ";while (current != nullptr) {cout << current->val << " ";current = current->next; // 移动到下一个节点}cout << endl;
}
6、判栈空
// 判断栈是否为空
bool IsEmpty(StackNode* head) {return head->next == nullptr; // 如果头节点的next指针为空,则栈为空
}
实现: 
#include<iostream>
using namespace std;// 定义链栈节点结构体
struct StackNode {int val;StackNode* next;
};// 创建链栈
StackNode* CreateStack() {StackNode* head = new StackNode(); // 创建头节点head->next = nullptr;return head;
}// 入栈操作
void Push(StackNode* head, int val) {StackNode* newNode = new StackNode{val, nullptr}; // 创建新节点newNode->next = head->next; // 将新节点链接到链表head->next = newNode; // 头节点指向新节点
}// 出栈操作
int Pop(StackNode* head) {if (head->next == nullptr) {cout << "栈为空,无法出栈。" << endl;return -1; // 返回-1表示栈空}StackNode* temp = head->next; // 临时节点int val = temp->val; // 保存要返回的值head->next = temp->next; // 头节点指向下一个节点delete temp; // 释放临时节点return val; // 返回栈顶元素
}// 遍历链栈
void TraverseStack(StackNode* head) {if (head->next == nullptr) {cout << "栈为空。" << endl;return;}StackNode* current = head->next; // 从栈顶开始遍历cout << "链栈元素: ";while (current != nullptr) {cout << current->val << " ";current = current->next; // 移动到下一个节点}cout << endl;
}// 获取栈顶元素
int GetTop(StackNode* head) {if (head->next == nullptr) {cout << "栈为空,无法获取栈顶元素。" << endl;return -1; // 返回-1表示栈空}return head->next->val; // 返回栈顶元素
}// 判断栈是否为空
bool IsEmpty(StackNode* head) {return head->next == nullptr; // 如果头节点的next指针为空,则栈为空
}int main() {StackNode* stack = CreateStack(); // 创建链栈cout << "入栈元素: 10, 20, 30, 40, 50" << endl;Push(stack, 10);Push(stack, 20);Push(stack, 30);Push(stack, 40);Push(stack, 50);cout << "栈顶元素: " << GetTop(stack) << endl;cout << "出栈元素: " << Pop(stack) << endl;cout << "栈顶元素: " << GetTop(stack) << endl;TraverseStack(stack); // 调用遍历链栈的方法cout << "栈是否为空: " << (IsEmpty(stack) ? "是" : "否") << endl;return 0;
}

队列

顺序队列

1、建立顺序队列
// 定义队列结构体
struct Queue {vector<int> elements; // 使用vector来存储队列元素
};// 创建队列
Queue* CreateQueue() {return new Queue(); // 创建队列对象
}
2、入队
// 入队操作
void Enqueue(Queue* queue, int val) {queue->elements.push_back(val); // 将元素添加到队列末尾
}
3、出队
// 出队操作
int Dequeue(Queue* queue) {if (queue->elements.empty()) { // 如果队列为空cout << "队列为空,无法出队。" << endl;return -1; // 返回-1表示队空}int val = queue->elements.front(); // 获取队首元素queue->elements.erase(queue->elements.begin()); // 删除队首元素return val; // 返回队首元素
}
4、求队列长度
int GetQueueLength(Queue* queue) {return queue->elements.size(); // 返回队列中元素的数量
}
5、遍历队列
// 遍历队列
void TraverseQueue(Queue* queue) {if (queue->elements.empty()) { // 如果队列为空cout << "队列为空。" << endl;return;}cout << "队列元素: ";for (int val : queue->elements) {cout << val << " ";}cout << endl;
}
实现:
#include<iostream>
#include<vector>
using namespace std;// 定义队列结构体
struct Queue {vector<int> elements; // 使用vector来存储队列元素
};// 创建队列
Queue* CreateQueue() {return new Queue(); // 创建队列对象
}// 入队操作
void Enqueue(Queue* queue, int val) {queue->elements.push_back(val); // 将元素添加到队列末尾
}// 出队操作
int Dequeue(Queue* queue) {if (queue->elements.empty()) { // 如果队列为空cout << "队列为空,无法出队。" << endl;return -1; // 返回-1表示队空}int val = queue->elements.front(); // 获取队首元素queue->elements.erase(queue->elements.begin()); // 删除队首元素return val; // 返回队首元素
}// 获取队列长度
int GetQueueLength(Queue* queue) {return queue->elements.size(); // 返回队列中元素的数量
}// 遍历队列
void TraverseQueue(Queue* queue) {if (queue->elements.empty()) { // 如果队列为空cout << "队列为空。" << endl;return;}cout << "队列元素: ";for (int val : queue->elements) {cout << val << " ";}cout << endl;
}// 获取队首元素
int GetFront(Queue* queue) {if (queue->elements.empty()) { // 如果队列为空cout << "队列为空,无法获取队首元素。" << endl;return -1; // 返回-1表示队空}return queue->elements.front(); // 返回队首元素
}// 判断队列是否为空
bool IsEmpty(Queue* queue) {return queue->elements.empty(); // 如果队列大小为0,则队列为空
}int main() {Queue* queue = CreateQueue(); // 创建队列cout << "入队元素: 10, 20, 30, 40, 50" << endl;Enqueue(queue, 10);Enqueue(queue, 20);Enqueue(queue, 30);Enqueue(queue, 40);Enqueue(queue, 50);TraverseQueue(queue); // 遍历队列cout << "队列长度: " << GetQueueLength(queue) << endl;cout << "队首元素: " << GetFront(queue) << endl;cout << "出队元素: " << Dequeue(queue) << endl;cout << "队首元素: " << GetFront(queue) << endl;cout << "队列是否为空: " << (IsEmpty(queue) ? "是" : "否") << endl;return 0;
}

链式队列

1、建立链式队列
// 定义链队列节点结构体
struct QueueNode {int val;QueueNode* next;
};// 创建链队列
QueueNode* CreateQueue() {QueueNode* head = new QueueNode(); // 创建头节点head->next = nullptr;return head;
}
2、入队
// 入队操作
void Enqueue(QueueNode* head, int val) {QueueNode* newNode = new QueueNode{val, nullptr}; // 创建新节点newNode->next = head->next; // 将新节点链接到链表head->next = newNode; // 头节点指向新节点
}
3、出队
// 出队操作
int Dequeue(QueueNode* head) {if (head->next == nullptr) {cout << "队列为空,无法出队。" << endl;return -1; // 返回-1表示队空}QueueNode* temp = head->next; // 临时节点int val = temp->val; // 保存要返回的值head->next = temp->next; // 头节点指向下一个节点delete temp; // 释放临时节点return val; // 返回队首元素
}
4、求队列长度
// 获取队列长度
int GetQueueLength(QueueNode* head) {int length = 0;QueueNode* current = head->next;while (current != nullptr) {length++; // 计算队列中元素的数量current = current->next;}return length;
}
5、遍历队列
// 遍历队列
void TraverseQueue(QueueNode* head) {if (head->next == nullptr) { // 如果队列为空cout << "队列为空。" << endl;return;}QueueNode* current = head->next;cout << "队列元素: ";while (current != nullptr) {cout << current->val << " ";current = current->next; // 移动到下一个节点}cout << endl;
}
实现:
#include<iostream>
using namespace std;// 定义链队列节点结构体
struct QueueNode {int val;QueueNode* next;
};// 创建链队列
QueueNode* CreateQueue() {QueueNode* head = new QueueNode(); // 创建头节点head->next = nullptr;return head;
}// 入队操作
void Enqueue(QueueNode* head, int val) {QueueNode* newNode = new QueueNode{val, nullptr}; // 创建新节点QueueNode* current = head;while (current->next != nullptr) {current = current->next; // 移动到链表末尾}current->next = newNode; // 将新节点链接到链表末尾
}// 出队操作
int Dequeue(QueueNode* head) {if (head->next == nullptr) {cout << "队列为空,无法出队。" << endl;return -1; // 返回-1表示队空}QueueNode* temp = head->next; // 临时节点int val = temp->val; // 保存要返回的值head->next = temp->next; // 头节点指向下一个节点delete temp; // 释放临时节点return val; // 返回队首元素
}// 获取队列长度
int GetQueueLength(QueueNode* head) {int length = 0;QueueNode* current = head->next;while (current != nullptr) {length++; // 计算队列中元素的数量current = current->next;}return length;
}// 遍历队列
void TraverseQueue(QueueNode* head) {if (head->next == nullptr) { // 如果队列为空cout << "队列为空。" << endl;return;}QueueNode* current = head->next;cout << "队列元素: ";while (current != nullptr) {cout << current->val << " ";current = current->next; // 移动到下一个节点}cout << endl;
}// 获取队首元素
int GetFront(QueueNode* head) {if (head->next == nullptr) {cout << "队列为空,无法获取队首元素。" << endl;return -1; // 返回-1表示队空}return head->next->val; // 返回队首元素
}// 判断队列是否为空
bool IsEmpty(QueueNode* head) {return head->next == nullptr; // 如果头节点的next指针为空,则队列空
}int main() {QueueNode* queue = CreateQueue(); // 创建链队列cout << "入队元素: 10, 20, 30, 40, 50" << endl;Enqueue(queue, 10);Enqueue(queue, 20);Enqueue(queue, 30);Enqueue(queue, 40);Enqueue(queue, 50);TraverseQueue(queue); // 遍历队列cout << "队列长度: " << GetQueueLength(queue) << endl;cout << "队首元素: " << GetFront(queue) << endl;cout << "出队元素: " << Dequeue(queue) << endl;cout << "队首元素: " << GetFront(queue) << endl;cout << "队列是否为空: " << (IsEmpty(queue) ? "是" : "否") << endl;return 0;
}

 三、树和二叉树

 

实现:

#include<iostream>
using namespace std;// 结构体
struct Bittree {char data;Bittree *lchild;Bittree *rchild;
};// 先序构建二叉树
Bittree* Creat() {char n;scanf(" %c", &n); // 注意在%c前加空格,以跳过任何前导空白if (n == '#') {return NULL;} else {Bittree* T = new Bittree();T->data = n;T->lchild = Creat();T->rchild = Creat();return T;}
}// 先序遍历
void PreOrder(Bittree *T) {if (T) {printf("%2c", T->data);PreOrder(T->lchild);PreOrder(T->rchild);}
}// 中序遍历
void InOrder(Bittree *T) {if (T) {InOrder(T->lchild);printf("%2c", T->data);InOrder(T->rchild);}
}// 后序遍历
void PostOrder(Bittree *T) {if (T) {PostOrder(T->lchild);PostOrder(T->rchild);printf("%2c", T->data);}
}// 统计叶子结点的个数
int Leaf(Bittree *T) {int LeafCount;if (T == NULL)LeafCount = 0;else if (T->lchild == NULL && T->rchild == NULL)LeafCount = 1;elseLeafCount = Leaf(T->lchild) + Leaf(T->rchild);return LeafCount;
}// 计算二叉树的深度
int TreeDepth(Bittree *T) {if (T == NULL)return 0;else {int depthleft = TreeDepth(T->lchild) + 1;int depthright = TreeDepth(T->rchild) + 1;return depthleft > depthright ? depthleft : depthright;}
}int main() {printf("先序构造一颗二叉树(左/右孩子为空用'#'表示):");Bittree *T = Creat();printf("此二叉树的先序遍历序列是:");PreOrder(T);printf("\n");printf("此二叉树的中序遍历序列是:");InOrder(T);printf("\n");printf("此二叉树的后序遍历序列是:");PostOrder(T);printf("\n");printf("这棵树叶子结点有%d个\n", Leaf(T));printf("这棵树的深度为:%d\n", TreeDepth(T));system("pause");return 0;
}

 四、图

实现:

#include<iostream>
#include<stack> // 引入栈头文件
using namespace std;
#define MAX_NUM 100// 定义邻接矩阵
struct Graph{int MaxArr[MAX_NUM][MAX_NUM];int num;
}; // 初始化图
Graph* create(int n){Graph* graph=new Graph();graph->num=n;for(int i=0;i<n;i++){for(int j=0;j<n;j++){graph->MaxArr[i][j]=0;}}return graph;
} // 添加单向边
void addEdge(Graph* graph,int src,int dest){graph->MaxArr[src][dest]=1;
} // 广度优先搜索
bool bfs(Graph* graph,int start,int end,int* parent){int visited[MAX_NUM];bool inQueue[MAX_NUM];int queue[MAX_NUM];int front=0,rear=0;for(int i=0;i<graph->num;i++){visited[i]=false;inQueue[i]=false;parent[i]=-1;}queue[rear++]=start;inQueue[start]=true;visited[start]=true;while(front<rear){int current=queue[front++];for(int i=0;i<graph->num;i++){if(!visited[i]&&graph->MaxArr[current][i]==1){queue[rear++]=i;inQueue[i]=true;visited[i]=true;parent[i]=current;}}}return visited[end];
} // 输出路径
void printPath(int* parent,int end){printf("Path from start to %d: ", end);if(parent[end]==-1){printf("There is no path\n");return;}stack<int> path; // 使用栈来存储路径int current = end;while(current != -1) {path.push(current); // 将节点压入栈中current = parent[current];}// 逐个弹出栈中的元素以实现倒序输出while(!path.empty()) {printf("%d ", path.top());path.pop();if(!path.empty()) {printf("-> ");}}printf("\n");
} int main(){int Num,start,end;printf("输入结点个数:");scanf("%d",&Num);Graph* graph=create(Num);printf("输入边(以'src dest'形式,输入0 0结束):");int src,dest;while(true){cin >> src >> dest;if(src == 0 && dest == 0) break; // 如果输入是0 0,则结束循环addEdge(graph,src,dest);}printf("输入起点:");scanf("%d",&start);printf("输入终点:");scanf("%d",&end);int* parent=(int*)malloc(Num*sizeof(int));if(bfs(graph,start,end,parent)){printPath(parent,end);}else{printf("There is no path\n");}free(parent);delete graph;return 0;
}

 

五、查找和排序

 折半查找实现:

#include <stdio.h>// 折半查找函数
int binarySearch(int arr[], int l, int r, int x) {if (r >= l) {int mid = l + (r - l) / 2;// 如果中间元素正好是要找的值,返回索引if (arr[mid] == x)return mid;// 如果中间元素比要找的值小,在右半部分继续查找if (arr[mid] < x)return binarySearch(arr, mid + 1, r, x);// 如果中间元素比要找的值大,在左半部分继续查找return binarySearch(arr, l, mid - 1, x);}// 如果数组中没有找到值,返回-1return -1;
}int main() {int arr[] = {12, 23, 28, 35, 37, 39, 50, 60, 78, 90};int n = sizeof(arr) / sizeof(arr[0]);int x;printf("输入待查找记录:");scanf("%d", &x);int result = binarySearch(arr, 0, n - 1, x);if (result == -1)printf("该记录不存在。\n");elseprintf("该记录在表中位置 %d。\n", result);return 0;
}

快速排序实现: 

#include <stdio.h>
int partition(int arr[], int low, int high);
void swap(int *xp, int *yp);// 快速排序函数
void quickSort(int arr[], int low, int high) {if (low < high) {int pi = partition(arr, low, high);// 递归排序左半部分quickSort(arr, low, pi - 1);// 递归排序右半部分quickSort(arr, pi + 1, high);}
}// 用于快速排序的辅助函数,用于分区
int partition(int arr[], int low, int high) {int pivot = arr[high]; // 选择最后一个元素作为基准int i = (low - 1); // 初始化指向比基准小的元素的指针for (int j = low; j <= high - 1; j++) {// 如果当前元素小于或等于基准,则交换元素if (arr[j] <= pivot) {i++;swap(&arr[i], &arr[j]);}}swap(&arr[i + 1], &arr[high]); // 将基准元素放在正确的位置return (i + 1);
}// 交换两个元素
void swap(int *xp, int *yp) {int temp = *xp;*xp = *yp;*yp = temp;
}int main() {int arr[] = {12, 23, 28, 35, 37, 39, 50, 60, 78, 90};int n = sizeof(arr) / sizeof(arr[0]);quickSort(arr, 0, n - 1);printf("排序后的数组:\n");for (int i = 0; i < n; i++)printf("%d ", arr[i]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/343818.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么换自己手机的ip地址

在互联网时代&#xff0c;IP地址已经成为了我们数字身份的一部分。无论是浏览网页、下载文件还是进行在线交流&#xff0c;我们的IP地址都在默默发挥着作用。然而&#xff0c;有时出于安全或隐私保护的考虑&#xff0c;我们可能需要更换手机的IP地址。那么&#xff0c;如何轻松…

Rust基础学习-Rust宏

Rust中的宏是生成另一段代码的一段代码。可以根据输入生成代码&#xff0c;简化重复模式&#xff0c;使得代码更加简洁。比如我们一直在用的println!,vec!,panic!都是宏。 创建宏 可以使用macro_rules!创建一个宏&#xff1a; macro_rules! macro_name {(...) > {...} }这…

自制植物大战僵尸:HTML5与JavaScript实现的简单游戏

引言 在本文中&#xff0c;我们将一起探索如何使用HTML5和JavaScript来创建一个简单的植物大战僵尸游戏。这不仅是一项有趣的编程挑战&#xff0c;也是学习游戏开发基础的绝佳机会。 什么是植物大战僵尸&#xff1f; 植物大战僵尸是一款流行的策略塔防游戏&#xff0c;玩家需…

2024年pmp的考试时间是什么时候?

2024年的考试时间已经确定&#xff1a;分别是3月、6月、8月、11月&#xff0c;共四次。具体的考试日期还需关注官网的通知。目前只能报名8月和11月的。 一、PMP报考条件 只要年满22周岁并且获得官方授权的培训机构颁发的35个PDU&#xff08;学时&#xff09;&#xff0c;就有…

类和对象(二)(C++)

初始化列表 class Date{public:Date(int year, int month, int day){_year year;_month month;_day day;}private:int _year;int _month;int _day;}; 虽然上述构造函数调用之后&#xff0c;对象中已经有了一个初始值&#xff0c;但是不能将其称为对对象中成员变量的初始化…

elementui Menu 二级菜单 min-width修改无效

原因&#xff1a;可能是生成的二级菜单样式里面没有带特定的hash属性 而vue代码里面样式里带了 scoped生成的样式有改样式选择器 从而无法成功选择 解决&#xff1a;让样式可以全局选择 不带属性选择器 单文件组件 CSS 功能 | Vue.js :global(.el-menu--vertical .el-menu--p…

Flink端到端的精确一次(Exactly-Once)

目录 状态一致性 端到端的状态一致性 端到端精确一次&#xff08;End-To-End Exactly-Once&#xff09; Flink内部的Exactly-Once 输入端保证 输出端保证 幂等写入 事务写入 Flink和Kafka连接时的精确一次保证 整体介绍 需要的配置 案例 状态一致性 流式计算本身就…

探索智慧林业系统的总体架构与应用

背景&#xff1a; 随着人们对森林资源保护和管理的重视&#xff0c;智慧林业系统作为一种新兴的林业管理手段&#xff0c;正在逐渐受到广泛关注和应用。智慧林业系统的总体架构设计与应用&#xff0c;将现代信息技术与林业管理相结合&#xff0c;为森林资源的保护、管理和利用…

Unity3d简单对话系统的实现——使用Dialogue editor完成对话系统

目录 前言 使用方法 1.下载dialogue editor 2.新建空物体 3.对对话内容进行编辑 4.对话画布建立 5.触发对话框代码 结束语 前言 今天是坚持写博客的第21天&#xff0c;很高兴自己可以坚持&#xff0c;也希望能与大家一起进步。我们今天来看unity3d当中的一个可以轻松实…

Qt下调用Snap7库与西门子PLC通信

文章目录 前言一、Snap7源码下载二、Snap7的dll常用函数功能介绍三、Snap7Lib.pri模块的封装四、下载链接总结 前言 本文主要讲述了在Qt下调用Snap7库与西门子PLC进行通信&#xff0c;在这里将Snap7的源码与动态库整合在一起封装了一个自己的Snap7Lib.pri子模块&#xff0c;方…

RHEL - 订阅、注册系统和 Yum Repository(新版界面)

《OpenShift / RHEL / DevSecOps 汇总目录》 演示环境说明 本文需要有 redhat.com 账号以及包含 RHEL 的有效订阅。 演示环境使用了通过 minimal 方式安装的 RHEL 7.6 环境&#xff0c;RHEL 可以访问互联网。 红帽网站 access.redhat.com 针对新用户提供了新版界面&#xff0…

vue3+vite插件开发

插件开发目的:由于我司使用的前端技术栈为vue3tsvite2.Xaxios,在前端代码框架设计初期,做了把axios挂载到proxy对象上的操作,具体可见我的另一篇文章vue3TS自动化封装全局api_ts 封装腾讯位置api-CSDN博客 现在可以实现vue2的类似this.$api.xxx去调用接口,但是vue2源码使用的是…

【CS.AI】GPT-4o:重新定义人工智能的新标杆

文章目录 1 序言2 GPT-4o的技术亮点3 GPT-4o与前代版本的对比3.1 热门AI模型对比表格GPT-3.5GPT-4GPT-4oBERTT5 3.2 其他 4 个人体验与感受5 结论 1 序言 嘿&#xff0c;大家好&#xff01;今天要聊聊一个超级酷的AI新突破——GPT-4o&#xff01;最近&#xff0c;OpenAI发布了…

MTK联发科MT6897(天玑8300)5G智能移动处理器规格参数

天玑 8300 采用台积电第二代 4nm 制程&#xff0c;基于 Armv9 CPU 架构&#xff0c;八核 CPU 包含 4 个 Cortex-A715 性能核心和 4 个 Cortex-A510 能效核心&#xff0c;CPU 峰值性能较上一代提升 20%&#xff0c;功耗节省 30%。 此外&#xff0c;天玑 8300 搭载 6 核 GPU Mal…

kafka-重试和死信主题(SpringBoot整合Kafka)

文章目录 1、重试和死信主题2、死信队列3、代码演示3.1、appication.yml3.2、引入spring-kafka依赖3.3、创建SpringBoot启动类3.4、创建生产者发送消息3.5、创建消费者消费消息 1、重试和死信主题 kafka默认支持重试和死信主题 重试主题&#xff1a;当消费者消费消息异常时&…

android中调用onnxruntime框架

创建空白项目 安装Android Studio及创建空白项目参考&#xff1a;【安卓Java原生开发学习记录】一、安卓开发环境的搭建与HelloWorld&#xff08;详细图文解释&#xff09;_安卓原生开发-CSDN博客 切记&#xff1a;build configuration language 一定选择Groovy&#xff01;官…

Java——IO流(一)-(1/8):File、IO流概述、File文件对象的创建(介绍、实例演示)

目录 File IO流概述 File文件对象的创建 介绍 实例演示 File 存储数据的方案 变量 double money 9999.5 数组 int[] age new int[100];对象 Student s new Student()集合 List<Student> students new ArrayList<>()…

Chrome 源码阅读:跟踪一个鼠标事件的流程

我们通过在关键节点打断点的方式&#xff0c;去分析一个鼠标事件的流程。 我们知道chromium是多进程模型&#xff0c;那么&#xff0c;我们可以推测&#xff1a;一个鼠标消息先从主进程产生&#xff0c;再通过跨进程通信发送给渲染进程&#xff0c;渲染进程再发送给WebFrame&a…

L45---506.相对名次(java)--排序

1.题目描述 2.知识点 &#xff08;1&#xff09;String.join(" ", words) 是 Java 中的一个语法&#xff0c;用于将数组或集合中的元素连接成一个单独的字符串&#xff0c;连接时使用指定的分隔符。这里的 " " 是作为分隔符使用的一个空格字符串。 Strin…

4、后端本地环境搭建

后端本地环境搭建 4.1 安装jdk 下载完成后双击安装的 jdk &#xff0c;点下一步&#xff0c;选择安装目录&#xff0c;一直点下一步&#xff0c;直到结束。 安装完成后同样需要配置环境变量 window s 搜索查看高级系统设置—— 高级 —— 环境变量 —— 系统变量 1、新建一…