文章目录
图
邻接表BFS/DFS
#include <iostream>
using namespace std;
#define MAX_VER_NUM 20
#define MAX_EDGE_NUM 200
bool visited[MAX_VER_NUM];
class Queue{
private:
int data[MAX_VER_NUM];
int front;
int rear;
public:
void InitQueue();
bool QueueEmpty();
bool EnQueue(int e);
int DeQueue();
};
void Queue::InitQueue(){
front = rear = 0;
}
bool Queue::QueueEmpty(){
if(rear==front)
return true;
else return false;
}
bool Queue::EnQueue(int e){
if((rear+1)%MAX_VER_NUM==front)
return false;
else{
data[rear] = e;
rear = (rear+1)%MAX_VER_NUM;
return true;
}
}
int Queue::DeQueue(){
if(QueueEmpty())
return false;
else{
int temp_front = front;
front = (front+1)%MAX_VER_NUM;
return data[temp_front];
}
}
typedef struct EdgeNode{
int adjvex;
EdgeNode* next;
}EdgeNode;
typedef struct VtxNode{
int data;
EdgeNode* first;
}VtxNode, AdjList[MAX_VER_NUM];
class Graph{
private:
AdjList vertices;
int vtxnum, edgenum;
public:
void CreatGraph();
void BFS();
void DFSTravel(int v);
void DFS();
};
void Graph::CreatGraph(){
cout << "请输入顶点数和边数:";
cin >> vtxnum >> edgenum;
cout << endl << "请输入每个顶点的信息:";
for(int i=0; i<vtxnum; i++){
cin >> vertices[i].data;
vertices[i].first = NULL;
}
cout << "请输入每条边的起点和终点:" << endl;
for(int j=0; j<edgenum; j++){
int vi, vj;
cin >> vi >> vj;
EdgeNode* e1 = new EdgeNode;
EdgeNode* e2 = new EdgeNode;
e1->adjvex = vi;
e2->adjvex = vj;
//有向边
e2->next = vertices[vi].first;
vertices[vi].first = e2;
}
}
void Graph::DFS(){
for(int i=0; i<vtxnum; i++)
visited[i] = 0;
for(int j=0; j<vtxnum; j++)
if(!visited[j])
DFSTravel(j);
cout << endl;
}
void Graph::DFSTravel(int v){
visited[v] = true;
cout << v << " ";
EdgeNode* p = vertices[v].first;
while(p){
if(!visited[p->adjvex])
DFSTravel(p->adjvex);
p = p->next;
}
}
void Graph::BFS(){
for(int i=0; i<vtxnum; i++)
visited[i] = false;
Queue Q;
Q.InitQueue();
for(int j=0; j<vtxnum; j++){
if(!visited[j]){
visited[j]=true;
cout << j << " ";
Q.EnQueue(j);
while(!Q.QueueEmpty()){
int w = Q.DeQueue();
EdgeNode* p = vertices[w].first;
while(p){
if(!visited[p->adjvex]){
cout << p->adjvex << " ";
visited[p->adjvex] = true;
Q.EnQueue(p->adjvex);
}
p = p->next;
}
}
}
}
}
int main(){
Graph G;
G.CreatGraph();
G.DFS();
G.BFS();
return 0;
}
邻接矩阵BFS/DFS
#include <iostream>
using namespace std;
#define MAX_VER_NUM 20
#define MAX_EDGE_NUM 200
#define INFINITY 2738432
bool visited[MAX_VER_NUM];
class Queue{
private:
int data[MAX_VER_NUM];
int front;
int rear;
public:
void InitQueue();
bool QueueEmpty();
bool EnQueue(int e);
int DeQueue();
};
void Queue::InitQueue(){
front = rear = 0;
}
bool Queue::QueueEmpty(){
if(rear==front)
return true;
else return false;
}
bool Queue::EnQueue(int e){
if((rear+1)%MAX_VER_NUM==front)
return false;
else{
data[rear] = e;
rear = (rear+1)%MAX_VER_NUM;
return true;
}
}
int Queue::DeQueue(){
if(QueueEmpty())
return false;
else{
int temp_front = front;
front = (front+1)%MAX_VER_NUM;
return data[temp_front];
}
}
class Graph{
private:
int vertices[MAX_VER_NUM];
int matrix[MAX_VER_NUM][MAX_VER_NUM];
int vtxnum, edgenum;
public:
void CreatGraph();
void BFS();
void DFSTravel(int v);
void DFS();
};
void Graph::CreatGraph(){
cout << "请输入顶点数和边数:";
cin >> vtxnum >> edgenum;
cout << endl << "请输入每个顶点的信息:";
for(int i=0; i<vtxnum; i++)
cin >> vertices[i];
for(int j=0; j<vtxnum; j++)
for(int k=0; k<vtxnum; k++)
matrix[j][k] = INFINITY;
cout << endl << "请输入每条边的起点和终点:" << endl;
for(int s=0; s<edgenum; s++){
int vi,vj;
cin >> vi >> vj;
matrix[vi][vj] = 1;//有向图
}
}
void Graph::DFS(){
for(int i=0; i<vtxnum; i++)
visited[i] = false;
for(int j=0; j<vtxnum; j++)
if(!visited[j])
DFSTravel(j);
cout << endl;
}
void Graph::DFSTravel(int v){
cout << v << " ";
visited[v] = true;
for(int j=0; j<vtxnum; j++)
if(matrix[v][j]==1 && !visited[j])
DFSTravel(j);
}
void Graph::BFS(){
for(int i=0; i<vtxnum; i++)
visited[i] = false;
Queue Q;
Q.InitQueue();
for(int j=0; j<vtxnum; j++){
if(!visited[j]){
cout << j << " ";
visited[j] = true;
Q.EnQueue(j);
while(!Q.QueueEmpty()){
int w = Q.DeQueue();
for(int k=0; k<vtxnum; k++){
if(!visited[k] && matrix[w][k]==1){
cout << k << " ";
visited[k] = true;
Q.EnQueue(k);
}
}
}
}
}
}
int main(){
Graph G;
G.CreatGraph();
G.DFS();
G.BFS();
return 0;
}
查找
顺序查找
#include <iostream>
using namespace std;
class List {
private:
int* listarray;
int length;
public:
List(int l);
~List();
void creatList();
void OrderSearch();
};
List::List(int l){
length = l;
listarray = new int[l];
}
List::~List(){delete []listarray;}
void List::creatList(){
cout << "请依次输入" << length << "个整数:";
for(int i=0; i<length; i++)
cin >> listarray[i];
}
void List::OrderSearch(){
cout << "请输入要查找的数:";
int key; cin >> key;
int flag=0;
for(int i=0; i<length; i++){
if(listarray[i]==key){
flag=1;
cout << "该数在第" << i+1 << "个位置" << endl;
break;
}
}
if(flag==0)
cout << "未找到该数!" << endl;
}
int main() {
List l1(10);
l1.creatList();
l1.OrderSearch();
return 0;
}
折半查找
#include <iostream>
using namespace std;
class List {
private:
int* listarray;
int length;
public:
List(int l);
~List();
void creatList();
void BinarySearch();
};
List::List(int l){
length = l;
listarray = new int[l];
}
List::~List(){delete []listarray;}
void List::creatList(){
cout << "请依次输入" << length << "个整数:";
for(int i=0; i<length; i++)
cin >> listarray[i];
}
void List::BinarySearch(){
cout << "请输入要查找的数:";
int key; cin >> key;
int flag = 0, low = 0, high = length-1;
while(low <= high){
int mid = (low+high)/2;
if(listarray[mid]==key){
flag=1;
cout << "该数在第" << mid+1 << "个位置" << endl;
break;
}
else if(listarray[mid]>key)
high = mid-1;
else low = mid+1;
}
if(flag==0)
cout << "未找到该数!" << endl;
}
int main() {
List l1(10);
l1.creatList();
l1.BinarySearch();
return 0;
}
排序
堆排序
#include <iostream>
using namespace std;
class List {
private:
int* listarray;
int length;
public:
List(int l);
~List();
void creatList();
void showList();
void HeapInsert();
void Heapify(int curr_length);
void HeapSort();
};
void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
List::List(int l){
length = l;
listarray = new int[l];
}
List::~List(){delete []listarray;}
void List::creatList(){
cout << "请依次输入" << length << "个整数:";
for(int i=0; i<length; i++)
cin >> listarray[i];
}
void List::showList(){
for(int i=0; i<length; i++)
cout << listarray[i] << " ";
cout << endl;
}
void List::HeapInsert(){
for(int i=1; i<length; i++){
int current = i, parent = (i-1)/2;
while(listarray[current]>listarray[parent]){
swap(listarray[current], listarray[parent]);
current = parent;
parent = (current-1)/2;
}
}
}
void List::Heapify(int curr_length){
int index = 0, left = 1, right = 2, largeindex;
while(left < curr_length){
if(listarray[left]<listarray[right] && right<curr_length)
largeindex = right;
else largeindex = left;
if(listarray[index]>listarray[largeindex])
break;
else{
swap(listarray[index], listarray[largeindex]);
index = largeindex;
left = 2*index+1;
right = 2*index+2;
}
}
}
void List::HeapSort(){
HeapInsert();
int curr_length = length;
while(curr_length>1){
swap(listarray[0], listarray[curr_length-1]);
curr_length--;
Heapify(curr_length);
}
}
int main() {
List l1(10);
l1.creatList();
cout << "按从小到大顺序排列:" ;
l1.HeapSort();
l1.showList();
return 0;
}
归并排序(递归版)
#include <iostream>
using namespace std;
class List {
private:
int* listarray;
int length;
public:
List(int l);
~List();
void creatList();
void showList();
void MergeSort();
void MergeSortHelp(int left, int right);
void Merge(int left, int right);
};
void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
List::List(int l){
length = l;
listarray = new int[l];
}
List::~List(){delete []listarray;}
void List::creatList(){
cout << "请依次输入" << length << "个整数:";
for(int i=0; i<length; i++)
cin >> listarray[i];
}
void List::showList(){
for(int i=0; i<length; i++)
cout << listarray[i] << " ";
cout << endl;
}
void List::Merge(int left, int right){
int* copyarray = new int[right-left+1];
int mid = (left+right)/2, i=left, j=mid+1, k=0;
while(i<=mid && j<=right){
if(listarray[i]<listarray[j])
copyarray[k++] = listarray[i++];
else
copyarray[k++] = listarray[j++];
}
while(i<=mid) copyarray[k++] = listarray[i++];
while(j<=right) copyarray[k++] = listarray[j++];
for(int s=left; s<=right; s++)
listarray[s] = copyarray[s-left];
delete []copyarray;
}
void List::MergeSortHelp(int left, int right){
if(left<right){
int mid = (left+right)/2;
MergeSortHelp(left, mid);
MergeSortHelp(mid+1, right);
Merge(left, right);
}
}
void List::MergeSort(){
MergeSortHelp(0, length-1);
}
int main() {
List l1(10);
l1.creatList();
cout << "按从小到大顺序排列:" ;
l1.MergeSort();
l1.showList();
return 0;
}
简单选择排序
#include <iostream>
using namespace std;
class List {
private:
int* listarray;
int length;
public:
List(int l);
~List();
void creatList();
void showList();
void SelectSort();
};
void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
List::List(int l){
length = l;
listarray = new int[l];
}
List::~List(){delete []listarray;}
void List::creatList(){
cout << "请依次输入" << length << "个整数:";
for(int i=0; i<length; i++)
cin >> listarray[i];
}
void List::showList(){
for(int i=0; i<length; i++)
cout << listarray[i] << " ";
cout << endl;
}
void List::SelectSort(){
for(int i=0; i<length; i++){
int min_index = i;
for(int j=i+1; j<length; j++){
if(listarray[min_index] > listarray[j])
min_index = j;
}
if(i!=min_index)
swap(listarray[min_index], listarray[i]);
}
}
int main() {
List l1(10);
l1.creatList();
cout << "按从小到大顺序排列:" ;
l1.SelectSort();
l1.showList();
return 0;
}
快速排序(递归版)
#include <iostream>
using namespace std;
class List {
private:
int* listarray;
int length;
public:
List(int l);
~List();
void creatList();
void showList();
int partition(int left, int right);
void QuickSortHelp(int left, int right);
void QuickSort();
};
void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
List::List(int l){
length = l;
listarray = new int[l];
}
List::~List(){delete []listarray;}
void List::creatList(){
cout << "请依次输入" << length << "个整数:";
for(int i=0; i<length; i++)
cin >> listarray[i];
}
void List::showList(){
for(int i=0; i<length; i++)
cout << listarray[i] << " ";
cout << endl;
}
int List::partition(int left, int right){
int povit = listarray[left], i = left, j = right;
while(i<j){
while(listarray[j]>=povit && i<j)//记得加等号
j--;
while(listarray[i]<=povit && i<j)//记得加等号
i++;
if(i<j)
swap(listarray[i], listarray[j]);
}
swap(listarray[left], listarray[i]);
return i;
}
void List::QuickSortHelp(int left, int right){
if(left<right){
int mid = partition(left, right);
QuickSortHelp(left, mid-1);
QuickSortHelp(mid+1, right);
}
}
void List::QuickSort(){
QuickSortHelp(0, length-1);
}
int main() {
List l1(10);
l1.creatList();
cout << "按从小到大顺序排列:" ;
l1.QuickSort();
l1.showList();
return 0;
}
冒泡排序
#include <iostream>
using namespace std;
class List {
private:
int* listarray;
int length;
public:
List(int l);
~List();
void creatList();
void showList();
void BubbleSort();
};
void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
List::List(int l){
length = l;
listarray = new int[l];
}
List::~List(){delete []listarray;}
void List::creatList(){
cout << "请依次输入" << length << "个整数:";
for(int i=0; i<length; i++)
cin >> listarray[i];
}
void List::showList(){
for(int i=0; i<length; i++)
cout << listarray[i] << " ";
cout << endl;
}
void List::BubbleSort(){
for(int i=0; i<length-1; i++)
for(int j=0; j<length-1-i; j++)
if(listarray[j]>listarray[j+1])
swap(listarray[j], listarray[j+1]);
}
int main() {
List l1(10);
l1.creatList();
cout << "按从小到大顺序排列:" ;
l1.BubbleSort();
l1.showList();
return 0;
}
🆙🆙🆙升级版
#include <iostream>
using namespace std;
class List {
private:
int* listarray;
int length;
public:
List(int l);
~List();
void creatList();
void showList();
void BubbleSort2();
};
void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
List::List(int l){
length = l;
listarray = new int[l];
}
List::~List(){delete []listarray;}
void List::creatList(){
cout << "请依次输入" << length << "个整数:";
for(int i=0; i<length; i++)
cin >> listarray[i];
}
void List::showList(){
for(int i=0; i<length; i++)
cout << listarray[i] << " ";
cout << endl;
}
void List::BubbleSort2(){
for(int i=0; i<length-1; i++){
bool flag = 0;
for(int j=0; j<length-1-i; j++){
if(listarray[j]>listarray[j+1]){
swap(listarray[j], listarray[j+1]);
flag = 1;
}
}
if(flag==0)
break;
}
}
int main() {
List l1(10);
l1.creatList();
cout << "按从小到大顺序排列:" ;
l1.BubbleSort2();
l1.showList();
return 0;
}
折半插入排序
#include <iostream>
using namespace std;
class List {
private:
int* listarray;
int length;
public:
List(int l);
~List();
void creatList();
void showList();
void BinaryInsertSort();
};
void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
List::List(int l){
length = l;
listarray = new int[l];
}
List::~List(){delete []listarray;}
void List::creatList(){
cout << "请依次输入" << length << "个整数:";
for(int i=0; i<length; i++)
cin >> listarray[i];
}
void List::showList(){
for(int i=0; i<length; i++)
cout << listarray[i] << " ";
cout << endl;
}
void List::BinaryInsertSort(){
int i,low,high,mid,temp;
for(i=1; i<length; i++){
temp = listarray[i];
low = 0;
high = i-1;
while(low <= high){
mid = (low+high)/2;
if(temp > listarray[mid])
low = mid+1;
else high = mid-1;
}
for(int j=i-1; j>=low; j--)
listarray[j+1] = listarray[j];
listarray[high+1] = temp;
}
}
int main() {
List l1(10);
l1.creatList();
cout << "按从小到大顺序排列:" ;
l1.BinaryInsertSort();
l1.showList();
return 0;
}
直接插入排序
#include <iostream>
using namespace std;
class List {
private:
int* listarray;
int length;
public:
List(int l);
~List();
void creatList();
void showList();
void InsertSort();
};
void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
List::List(int l){
length = l;
listarray = new int[l];
}
List::~List(){delete []listarray;}
void List::creatList(){
cout << "请依次输入" << length << "个整数:";
for(int i=0; i<length; i++)
cin >> listarray[i];
}
void List::showList(){
for(int i=0; i<length; i++)
cout << listarray[i] << " ";
cout << endl;
}
void List::InsertSort(){
for(int i=1; i<length; i++)
for(int j=i-1; j>=0; j--)
if(listarray[j]>listarray[j+1])
swap(listarray[j], listarray[j+1]);
}
int main() {
List l1(10);
l1.creatList();
cout << "按从小到大顺序排列:" ;
l1.InsertSort();
l1.showList();
return 0;
}
图
邻接表BFS/DFS
#include <iostream>
using namespace std;
#define MAX_VER_NUM 20
#define MAX_EDGE_NUM 200
bool visited[MAX_VER_NUM];
class Queue{
private:
int data[MAX_VER_NUM];
int front;
int rear;
public:
void InitQueue();
bool QueueEmpty();
bool EnQueue(int e);
int DeQueue();
};
void Queue::InitQueue(){
front = rear = 0;
}
bool Queue::QueueEmpty(){
if(rear==front)
return true;
else return false;
}
bool Queue::EnQueue(int e){
if((rear+1)%MAX_VER_NUM==front)
return false;
else{
data[rear] = e;
rear = (rear+1)%MAX_VER_NUM;
return true;
}
}
int Queue::DeQueue(){
if(QueueEmpty())
return false;
else{
int temp_front = front;
front = (front+1)%MAX_VER_NUM;
return data[temp_front];
}
}
typedef struct EdgeNode{
int adjvex;
EdgeNode* next;
}EdgeNode;
typedef struct VtxNode{
int data;
EdgeNode* first;
}VtxNode, AdjList[MAX_VER_NUM];
class Graph{
private:
AdjList vertices;
int vtxnum, edgenum;
public:
void CreatGraph();
void BFS();
void DFSTravel(int v);
void DFS();
};
void Graph::CreatGraph(){
cout << "请输入顶点数和边数:";
cin >> vtxnum >> edgenum;
cout << endl << "请输入每个顶点的信息:";
for(int i=0; i<vtxnum; i++){
cin >> vertices[i].data;
vertices[i].first = NULL;
}
cout << "请输入每条边的起点和终点:" << endl;
for(int j=0; j<edgenum; j++){
int vi, vj;
cin >> vi >> vj;
EdgeNode* e1 = new EdgeNode;
EdgeNode* e2 = new EdgeNode;
e1->adjvex = vi;
e2->adjvex = vj;
//有向边
e2->next = vertices[vi].first;
vertices[vi].first = e2;
}
}
void Graph::DFS(){
for(int i=0; i<vtxnum; i++)
visited[i] = 0;
for(int j=0; j<vtxnum; j++)
if(!visited[j])
DFSTravel(j);
cout << endl;
}
void Graph::DFSTravel(int v){
visited[v] = true;
cout << v << " ";
EdgeNode* p = vertices[v].first;
while(p){
if(!visited[p->adjvex])
DFSTravel(p->adjvex);
p = p->next;
}
}
void Graph::BFS(){
for(int i=0; i<vtxnum; i++)
visited[i] = false;
Queue Q;
Q.InitQueue();
for(int j=0; j<vtxnum; j++){
if(!visited[j]){
visited[j]=true;
cout << j << " ";
Q.EnQueue(j);
while(!Q.QueueEmpty()){
int w = Q.DeQueue();
EdgeNode* p = vertices[w].first;
while(p){
if(!visited[p->adjvex]){
cout << p->adjvex << " ";
visited[p->adjvex] = true;
Q.EnQueue(p->adjvex);
}
p = p->next;
}
}
}
}
}
int main(){
Graph G;
G.CreatGraph();
G.DFS();
G.BFS();
return 0;
}
邻接矩阵BFS/DFS
#include <iostream>
using namespace std;
#define MAX_VER_NUM 20
#define MAX_EDGE_NUM 200
#define INFINITY 2738432
bool visited[MAX_VER_NUM];
class Queue{
private:
int data[MAX_VER_NUM];
int front;
int rear;
public:
void InitQueue();
bool QueueEmpty();
bool EnQueue(int e);
int DeQueue();
};
void Queue::InitQueue(){
front = rear = 0;
}
bool Queue::QueueEmpty(){
if(rear==front)
return true;
else return false;
}
bool Queue::EnQueue(int e){
if((rear+1)%MAX_VER_NUM==front)
return false;
else{
data[rear] = e;
rear = (rear+1)%MAX_VER_NUM;
return true;
}
}
int Queue::DeQueue(){
if(QueueEmpty())
return false;
else{
int temp_front = front;
front = (front+1)%MAX_VER_NUM;
return data[temp_front];
}
}
class Graph{
private:
int vertices[MAX_VER_NUM];
int matrix[MAX_VER_NUM][MAX_VER_NUM];
int vtxnum, edgenum;
public:
void CreatGraph();
void BFS();
void DFSTravel(int v);
void DFS();
};
void Graph::CreatGraph(){
cout << "请输入顶点数和边数:";
cin >> vtxnum >> edgenum;
cout << endl << "请输入每个顶点的信息:";
for(int i=0; i<vtxnum; i++)
cin >> vertices[i];
for(int j=0; j<vtxnum; j++)
for(int k=0; k<vtxnum; k++)
matrix[j][k] = INFINITY;
cout << endl << "请输入每条边的起点和终点:" << endl;
for(int s=0; s<edgenum; s++){
int vi,vj;
cin >> vi >> vj;
matrix[vi][vj] = 1;//有向图
}
}
void Graph::DFS(){
for(int i=0; i<vtxnum; i++)
visited[i] = false;
for(int j=0; j<vtxnum; j++)
if(!visited[j])
DFSTravel(j);
cout << endl;
}
void Graph::DFSTravel(int v){
cout << v << " ";
visited[v] = true;
for(int j=0; j<vtxnum; j++)
if(matrix[v][j]==1 && !visited[j])
DFSTravel(j);
}
void Graph::BFS(){
for(int i=0; i<vtxnum; i++)
visited[i] = false;
Queue Q;
Q.InitQueue();
for(int j=0; j<vtxnum; j++){
if(!visited[j]){
cout << j << " ";
visited[j] = true;
Q.EnQueue(j);
while(!Q.QueueEmpty()){
int w = Q.DeQueue();
for(int k=0; k<vtxnum; k++){
if(!visited[k] && matrix[w][k]==1){
cout << k << " ";
visited[k] = true;
Q.EnQueue(k);
}
}
}
}
}
}
int main(){
Graph G;
G.CreatGraph();
G.DFS();
G.BFS();
return 0;
}
查找
顺序查找
#include <iostream>
using namespace std;
class List {
private:
int* listarray;
int length;
public:
List(int l);
~List();
void creatList();
void OrderSearch();
};
List::List(int l){
length = l;
listarray = new int[l];
}
List::~List(){delete []listarray;}
void List::creatList(){
cout << "请依次输入" << length << "个整数:";
for(int i=0; i<length; i++)
cin >> listarray[i];
}
void List::OrderSearch(){
cout << "请输入要查找的数:";
int key; cin >> key;
int flag=0;
for(int i=0; i<length; i++){
if(listarray[i]==key){
flag=1;
cout << "该数在第" << i+1 << "个位置" << endl;
break;
}
}
if(flag==0)
cout << "未找到该数!" << endl;
}
int main() {
List l1(10);
l1.creatList();
l1.OrderSearch();
return 0;
}
折半查找
#include <iostream>
using namespace std;
class List {
private:
int* listarray;
int length;
public:
List(int l);
~List();
void creatList();
void BinarySearch();
};
List::List(int l){
length = l;
listarray = new int[l];
}
List::~List(){delete []listarray;}
void List::creatList(){
cout << "请依次输入" << length << "个整数:";
for(int i=0; i<length; i++)
cin >> listarray[i];
}
void List::BinarySearch(){
cout << "请输入要查找的数:";
int key; cin >> key;
int flag = 0, low = 0, high = length-1;
while(low <= high){
int mid = (low+high)/2;
if(listarray[mid]==key){
flag=1;
cout << "该数在第" << mid+1 << "个位置" << endl;
break;
}
else if(listarray[mid]>key)
high = mid-1;
else low = mid+1;
}
if(flag==0)
cout << "未找到该数!" << endl;
}
int main() {
List l1(10);
l1.creatList();
l1.BinarySearch();
return 0;
}
排序
堆排序
#include <iostream>
using namespace std;
class List {
private:
int* listarray;
int length;
public:
List(int l);
~List();
void creatList();
void showList();
void HeapInsert();
void Heapify(int curr_length);
void HeapSort();
};
void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
List::List(int l){
length = l;
listarray = new int[l];
}
List::~List(){delete []listarray;}
void List::creatList(){
cout << "请依次输入" << length << "个整数:";
for(int i=0; i<length; i++)
cin >> listarray[i];
}
void List::showList(){
for(int i=0; i<length; i++)
cout << listarray[i] << " ";
cout << endl;
}
void List::HeapInsert(){
for(int i=1; i<length; i++){
int current = i, parent = (i-1)/2;
while(listarray[current]>listarray[parent]){
swap(listarray[current], listarray[parent]);
current = parent;
parent = (current-1)/2;
}
}
}
void List::Heapify(int curr_length){
int index = 0, left = 1, right = 2, largeindex;
while(left < curr_length){
if(listarray[left]<listarray[right] && right<curr_length)
largeindex = right;
else largeindex = left;
if(listarray[index]>listarray[largeindex])
break;
else{
swap(listarray[index], listarray[largeindex]);
index = largeindex;
left = 2*index+1;
right = 2*index+2;
}
}
}
void List::HeapSort(){
HeapInsert();
int curr_length = length;
while(curr_length>1){
swap(listarray[0], listarray[curr_length-1]);
curr_length--;
Heapify(curr_length);
}
}
int main() {
List l1(10);
l1.creatList();
cout << "按从小到大顺序排列:" ;
l1.HeapSort();
l1.showList();
return 0;
}
归并排序(递归版)
#include <iostream>
using namespace std;
class List {
private:
int* listarray;
int length;
public:
List(int l);
~List();
void creatList();
void showList();
void MergeSort();
void MergeSortHelp(int left, int right);
void Merge(int left, int right);
};
void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
List::List(int l){
length = l;
listarray = new int[l];
}
List::~List(){delete []listarray;}
void List::creatList(){
cout << "请依次输入" << length << "个整数:";
for(int i=0; i<length; i++)
cin >> listarray[i];
}
void List::showList(){
for(int i=0; i<length; i++)
cout << listarray[i] << " ";
cout << endl;
}
void List::Merge(int left, int right){
int* copyarray = new int[right-left+1];
int mid = (left+right)/2, i=left, j=mid+1, k=0;
while(i<=mid && j<=right){
if(listarray[i]<listarray[j])
copyarray[k++] = listarray[i++];
else
copyarray[k++] = listarray[j++];
}
while(i<=mid) copyarray[k++] = listarray[i++];
while(j<=right) copyarray[k++] = listarray[j++];
for(int s=left; s<=right; s++)
listarray[s] = copyarray[s-left];
delete []copyarray;
}
void List::MergeSortHelp(int left, int right){
if(left<right){
int mid = (left+right)/2;
MergeSortHelp(left, mid);
MergeSortHelp(mid+1, right);
Merge(left, right);
}
}
void List::MergeSort(){
MergeSortHelp(0, length-1);
}
int main() {
List l1(10);
l1.creatList();
cout << "按从小到大顺序排列:" ;
l1.MergeSort();
l1.showList();
return 0;
}
简单选择排序
#include <iostream>
using namespace std;
class List {
private:
int* listarray;
int length;
public:
List(int l);
~List();
void creatList();
void showList();
void SelectSort();
};
void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
List::List(int l){
length = l;
listarray = new int[l];
}
List::~List(){delete []listarray;}
void List::creatList(){
cout << "请依次输入" << length << "个整数:";
for(int i=0; i<length; i++)
cin >> listarray[i];
}
void List::showList(){
for(int i=0; i<length; i++)
cout << listarray[i] << " ";
cout << endl;
}
void List::SelectSort(){
for(int i=0; i<length; i++){
int min_index = i;
for(int j=i+1; j<length; j++){
if(listarray[min_index] > listarray[j])
min_index = j;
}
if(i!=min_index)
swap(listarray[min_index], listarray[i]);
}
}
int main() {
List l1(10);
l1.creatList();
cout << "按从小到大顺序排列:" ;
l1.SelectSort();
l1.showList();
return 0;
}
快速排序(递归版)
#include <iostream>
using namespace std;
class List {
private:
int* listarray;
int length;
public:
List(int l);
~List();
void creatList();
void showList();
int partition(int left, int right);
void QuickSortHelp(int left, int right);
void QuickSort();
};
void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
List::List(int l){
length = l;
listarray = new int[l];
}
List::~List(){delete []listarray;}
void List::creatList(){
cout << "请依次输入" << length << "个整数:";
for(int i=0; i<length; i++)
cin >> listarray[i];
}
void List::showList(){
for(int i=0; i<length; i++)
cout << listarray[i] << " ";
cout << endl;
}
int List::partition(int left, int right){
int povit = listarray[left], i = left, j = right;
while(i<j){
while(listarray[j]>=povit && i<j)//记得加等号
j--;
while(listarray[i]<=povit && i<j)//记得加等号
i++;
if(i<j)
swap(listarray[i], listarray[j]);
}
swap(listarray[left], listarray[i]);
return i;
}
void List::QuickSortHelp(int left, int right){
if(left<right){
int mid = partition(left, right);
QuickSortHelp(left, mid-1);
QuickSortHelp(mid+1, right);
}
}
void List::QuickSort(){
QuickSortHelp(0, length-1);
}
int main() {
List l1(10);
l1.creatList();
cout << "按从小到大顺序排列:" ;
l1.QuickSort();
l1.showList();
return 0;
}
冒泡排序
#include <iostream>
using namespace std;
class List {
private:
int* listarray;
int length;
public:
List(int l);
~List();
void creatList();
void showList();
void BubbleSort();
};
void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
List::List(int l){
length = l;
listarray = new int[l];
}
List::~List(){delete []listarray;}
void List::creatList(){
cout << "请依次输入" << length << "个整数:";
for(int i=0; i<length; i++)
cin >> listarray[i];
}
void List::showList(){
for(int i=0; i<length; i++)
cout << listarray[i] << " ";
cout << endl;
}
void List::BubbleSort(){
for(int i=0; i<length-1; i++)
for(int j=0; j<length-1-i; j++)
if(listarray[j]>listarray[j+1])
swap(listarray[j], listarray[j+1]);
}
int main() {
List l1(10);
l1.creatList();
cout << "按从小到大顺序排列:" ;
l1.BubbleSort();
l1.showList();
return 0;
}
🆙🆙🆙升级版
#include <iostream>
using namespace std;
class List {
private:
int* listarray;
int length;
public:
List(int l);
~List();
void creatList();
void showList();
void BubbleSort2();
};
void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
List::List(int l){
length = l;
listarray = new int[l];
}
List::~List(){delete []listarray;}
void List::creatList(){
cout << "请依次输入" << length << "个整数:";
for(int i=0; i<length; i++)
cin >> listarray[i];
}
void List::showList(){
for(int i=0; i<length; i++)
cout << listarray[i] << " ";
cout << endl;
}
void List::BubbleSort2(){
for(int i=0; i<length-1; i++){
bool flag = 0;
for(int j=0; j<length-1-i; j++){
if(listarray[j]>listarray[j+1]){
swap(listarray[j], listarray[j+1]);
flag = 1;
}
}
if(flag==0)
break;
}
}
int main() {
List l1(10);
l1.creatList();
cout << "按从小到大顺序排列:" ;
l1.BubbleSort2();
l1.showList();
return 0;
}
折半插入排序
#include <iostream>
using namespace std;
class List {
private:
int* listarray;
int length;
public:
List(int l);
~List();
void creatList();
void showList();
void BinaryInsertSort();
};
void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
List::List(int l){
length = l;
listarray = new int[l];
}
List::~List(){delete []listarray;}
void List::creatList(){
cout << "请依次输入" << length << "个整数:";
for(int i=0; i<length; i++)
cin >> listarray[i];
}
void List::showList(){
for(int i=0; i<length; i++)
cout << listarray[i] << " ";
cout << endl;
}
void List::BinaryInsertSort(){
int i,low,high,mid,temp;
for(i=1; i<length; i++){
temp = listarray[i];
low = 0;
high = i-1;
while(low <= high){
mid = (low+high)/2;
if(temp > listarray[mid])
low = mid+1;
else high = mid-1;
}
for(int j=i-1; j>=low; j--)
listarray[j+1] = listarray[j];
listarray[high+1] = temp;
}
}
int main() {
List l1(10);
l1.creatList();
cout << "按从小到大顺序排列:" ;
l1.BinaryInsertSort();
l1.showList();
return 0;
}
直接插入排序
#include <iostream>
using namespace std;
class List {
private:
int* listarray;
int length;
public:
List(int l);
~List();
void creatList();
void showList();
void InsertSort();
};
void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
List::List(int l){
length = l;
listarray = new int[l];
}
List::~List(){delete []listarray;}
void List::creatList(){
cout << "请依次输入" << length << "个整数:";
for(int i=0; i<length; i++)
cin >> listarray[i];
}
void List::showList(){
for(int i=0; i<length; i++)
cout << listarray[i] << " ";
cout << endl;
}
void List::InsertSort(){
for(int i=1; i<length; i++)
for(int j=i-1; j>=0; j--)
if(listarray[j]>listarray[j+1])
swap(listarray[j], listarray[j+1]);
}
int main() {
List l1(10);
l1.creatList();
cout << "按从小到大顺序排列:" ;
l1.InsertSort();
l1.showList();
return 0;
}