数据结构--实验

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

目录

一、线性表😎

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.mzph.cn/pingmian/24973.shtml

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

相关文章

将web项目打包成electron桌面端教程(一)vue3+vite+js

说明&#xff1a;后续项目需要web端和桌面端&#xff0c;为了提高开发效率&#xff0c;准备直接将web端的代码打包成桌面端&#xff0c;在此提前记录一下demo打包的过程&#xff0c;需要注意的是vue2或者vue3的打包方式各不同&#xff0c;如果你的项目不是vue3vitejs&#xff0…

数字孪生技术体系和核心能力整理

最近对数字孪生技术进行了跟踪调研学习,整理形成了调研成果,供大家参考。通过学习,发现数字孪生技术的构建过程其实就是数字孪生体的构建与应用过程,数字孪生体的构建是一个体系化的系统工程,数字化转型的最终形态应该就是数实融合互动互联的终极状态。数实融合是每个行业…

[每周一更]-(第100期):介绍 goctl自动生成代码

​ 在自己组件库中&#xff0c;由于部分设计会存在重复引用各个模板的文件&#xff0c;并且基础架构中需要基础模块内容&#xff0c;就想到自动生成代码模板&#xff0c;刚好之前有使用过goctl&#xff0c;以下就简单描述下gozero中goctl场景和逻辑&#xff0c;后续自己借鉴将自…

英语学习笔记32——What‘s he/she/it doing?

What’s he/she/it doing? 他/她/它 正在做什么&#xff1f; 词汇 Vocabulary type /taɪp/ v. 打字 n. 类型&#xff0c;签字 ing形式&#xff1a;typeing 用法&#xff1a;this type of …    这种类型的…… 例句&#xff1a;我喜欢这种苹果。    I like this type…

java自学阶段二:JavaWeb开发--day80(项目实战2之苍穹外卖)

《项目案例—黑马苍穹外卖》 目录&#xff1a; 学习目标项目介绍前端环境搭建(前期直接导入老师的项目&#xff0c;后期自己敲&#xff09;后端环境搭建&#xff08;导入初始项目&#xff0c;新建仓库使用git管理项目&#xff0c;新建数据库&#xff0c;修改登录功能&#xff…

[office] 如何在Excel中拉动单元格时表头不变形- #学习方法#职场发展#经验分享

如何在Excel中拉动单元格时表头不变形? 如何在Excel中拉动单元格时表头不变形&#xff1f;Excel是我们常用的办公软件&#xff0c;当我们使用Excel拉动单元格时表头不变形&#xff0c;该如何操作呢&#xff0c;下面小编就为大家做详细讲解 如何在Excel中拉动单元格时表头不变…

用户输入表格数据设计(XPTable控件使用说明九)

XP Table控件可以编辑数据&#xff0c;程序也可以使用编辑后的数据&#xff0c;但是程序新建时又从初始化数据到模型到显示&#xff0c;这两步有点绕&#xff0c;做了一个实例来说明这块内容。 流程1&#xff1a;初始化数据--> model--> UI show 流程2&#xff1a;UI--…

skywalking基础使用

skywalking基础使用 找链路追踪Id将链路追踪Id拿到skywalking-ui中筛选对应链路补充说明例如, sql的打印能让我们了解到代码中对应的sql是否符合预期 找链路追踪Id 在接口响应header中复制x-trace-id 这个接口响应正常了, 异常没有暴露到前端, 且调用链路很长, 但我们借助s…

【讲解下ECMAScript和JavaScript之间有何区别?】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

第1章 起步

第1章 起步 1.1搭建编程环境1.2 在不同操作系统中搭建 Python 编程环境1.3 运行Hello world 程序1.4 解决安装问题1.5 从终端运行 Python 程序 1.1搭建编程环境 1.1.1 Python 版本 本书编写期间的最新版本为 Python 3.7 1.1.2 运行 Python 代码片段 Python 自带一个在终端窗口…

树莓派4B 零起点(一) 树莓派 无屏 从购买到启动

目录 背景 一. 准备工作 二、烧录系统 三、连接系统 背景 准备开发ROS机器人&#xff0c;在淘宝上购买的树莓派4B(4G)到货了&#xff0c;配件都很齐全&#xff0c;那么就直接开箱验货。 一. 准备工作 1 、硬件&#xff1a;(如下图) (我的购买链接: 树莓派4B 4g 套件) 2…

Java Web学习笔记26——Element常用组件

常见组件&#xff1a; 就是一个复制和粘贴的过程。 Table表格&#xff1a;用于展示多条结构类的数据&#xff0c;可对数据进行排序、筛选、对比或其他自定义操作。 常见组件-分页主键&#xff1a; Pagination&#xff1a;分页&#xff1a;当数据量比较多时&#xff0c;使用分…

【WEB前端2024】智体OS:poplang编程控制成本小千元的长续航robot机器人底盘(开源)

【WEB前端2024】智体OS&#xff1a;poplang编程控制成本小千元的长续航robot机器人底盘&#xff08;开源&#xff09; 前言&#xff1a;dtns.network是一款主要由JavaScript编写的智体世界引擎&#xff08;内嵌了three.js编辑器的定制版-支持以第一视角游览3D场馆&#xff09;…

网页文档下载不了怎么办 网页文档下载方法

一个方法&#xff0c;搞定所有网页文档下载。如果你也需要从网页下载各种文档&#xff0c;那么本文一定可以帮到你。无须充值会员&#xff0c;各大平台文档下到爽。看到就是赚到&#xff0c;还不赶快学起来。有关网页文档下载不了怎么办&#xff0c;网页文档下载方法的问题&…

端午与高考的交汇点:家的温暖与梦想的起点

当端午节的粽香弥漫在街头巷尾&#xff0c;高考的脚步也悄然而至。这两个看似毫无关联的时刻&#xff0c;却在每年的六月&#xff0c;奇妙地交汇在一起&#xff0c;为我们带来了一段特别的记忆。这不仅是家的温暖与梦想的起点相遇的时刻&#xff0c;更是传统文化与现代追求共融…

Redis进阶知识个人汇总

持久化 三种方式实现它的持久化&#xff1a; RDB持久化 全称Redis数据备份文件&#xff0c;又称Redis数据快照 这种就是将Redis内存中所有数据记录到磁盘中&#xff0c;当实例出故障后&#xff0c;从磁盘中读快照文件进行恢复数据。 一般使用bgsave指令实现 复制主线程得到一…

记一次源码部分丢失后补救过程

起因 最近植物大战僵尸杂交版玩的入迷&#xff0c;写了一个“神奇”小工具&#xff0c;来辅助游戏。用Git新建一个库&#xff0c;想把代码备份到GitHub&#xff0c;结果push错库了&#xff0c;无奈reset&#xff0c;结果把本地项目一起reset了&#xff0c;结果就是源代码丢失。…

k8s——secret配置资源管理

一、Secret 1.1 Secret定义 Secret是用来保存密码、token、密钥等敏感数据的k8s资源&#xff0c;这类数据虽然也可以存放在Pod或者镜像中&#xff0c;但是放在Secret中是为了更方便的控制如何使用数据&#xff0c;并减少暴露的风险。 1.2 Secret类型 kubernetes.io/service-ac…

SpringBoot+Vue网上超市系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 系统角色对应功能 用户管理员 系统功能截图

Cesium项目报错An error occurred while rendering. Rendering has stopped.

一般就是本地打开会报错&#xff0c;改成用本地服务器打开 全局安装一个live-server sudo cnpm i live-server -g然后新增一个package.json文件 npm init -y然后在package.json的scripts中增加一个命令 "server": "live-server ./ --port8181 --hostlocalhos…