Skip to content

Commit 86e392f

Browse files
author
公众号:Rong姐姐好可爱
authored
Merge pull request #89 from lir0115/fix/style
2 parents de08122 + ec1dba6 commit 86e392f

40 files changed

+1660
-23
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// 折半查找
2+
void BinaryInsertSort(ElemType Arr[],int n){
3+
int i,j,lowIndex,highIndex,midIndex;
4+
5+
for(i=2;j<=n;i++){
6+
// 将待排序的元素暂存在Arr[0]上
7+
Arr[0]=Arr[i];
8+
9+
lowIndex=1; // 左侧子表 折半查找起始位置
10+
highIndex=i-1; // 左侧子表 折半查找结束位置
11+
while(lowIndex<=highIndex){
12+
13+
// 左侧有序子表的中间位置角标
14+
midIndex=(lowIndex+heightIndex)/2;
15+
16+
if(Arr[midIndex].key>Arr[0].key){
17+
// 小于中间元素,插入位置在子表左侧
18+
highIndex=mid-1
19+
}else{
20+
// 大于或者等于中间元素,插入位置在子表右侧
21+
lowIndex=midIndex+1;
22+
}
23+
}
24+
25+
// 跳出循环需要(lowIndex>heightIndex),
26+
// 说明待插入位置的角标在heightIndex之后,为 heightIndex+1,此时需要将(heightIndex,i)之间的所有元素后移
27+
28+
for(j=i-1;j>highIndex;--j){
29+
Arr[j+1]=Arr[j]
30+
}
31+
32+
// 后移完成后,将元素Arr[0]赋值到位置(highIndex+1)上
33+
Arr[highIndex+1]=Arr[0]
34+
}
35+
}

code/ds/c++版本/BubbleSort.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// 冒泡排序
2+
void BubbleSwapSort(ElemType A[], int n){
3+
for(i=0;i<n-1;i++){
4+
// 当前趟次冒泡,是否发生了元素交换,初始化为false
5+
bool flag=false;
6+
7+
for(j=n-1;j>i;j--){
8+
if(A[j-1].key>A[j].key){
9+
// 将两个元素A[j-1]、A[j]进行交换,有多种方法
10+
swap(A[j-1],A[j])
11+
// 确认已发生交换
12+
flag=true
13+
}
14+
}
15+
16+
// 本趟遍历后没有发生交换,说明表已经有序
17+
if(flag==false){
18+
return ;
19+
}
20+
}
21+
}
22+
23+
/**
24+
* 加减法实现两个元素值互换
25+
*/
26+
void swap(int a, int b){
27+
// 此时a为两值的和
28+
a=a+b;
29+
// 此时b的值为a
30+
b=a-b
31+
// 如何实现让a的值为b呢??此时a的值为b
32+
a=a-b;
33+
}
34+
35+
36+
// 临时变量实现两个元素值的互换
37+
void swap(int a,int b){
38+
int temp;
39+
temp=a;
40+
a=b;
41+
b=temp
42+
}
43+

code/ds/c++版本/LinkList.cpp

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
// 单链表头插法
2+
LinkList CreateListWithStartNode(LinkList &L){
3+
4+
LNode *s;
5+
int x;
6+
L=(LinkList)malloc(sizeof(LNode)); // 创建头结点L
7+
L->next=NULL; // 初始化空链表
8+
9+
// 控制台输入值
10+
scanf("%d",&x);
11+
12+
// 输入9999 表示结束
13+
while(x!==9999){
14+
// 开辟新结点存储空间
15+
s=(LNode*)malloc(sizeof(LNode));
16+
// 结点数据域赋值
17+
s->data=x;
18+
// 修改指针,新结点插入表中【注意:L->next为头结点的指针域】
19+
s->next=L->next;
20+
L->next=s;
21+
scanf("%d",&x);
22+
}
23+
24+
// 返回单链表
25+
return L;
26+
}
27+
28+
// 单链表尾插法
29+
LinkList CreateListWithEndNode(LinkList &L){
30+
31+
32+
int x; // 输入结点值
33+
L=(LinkList)malloc(sizeof(LNode));
34+
LNode *s; // 新结点s
35+
LNode *r=L; // r为尾指针
36+
37+
// 控制台输入值
38+
scanf("%d",&x);
39+
40+
while(x!==9999){
41+
// 开辟新结点存储空间
42+
s=(LNode *)malloc(sizeof(LNode));
43+
44+
// 新结点s的数据域赋值为x
45+
s->data=x;
46+
// 单链表L的尾指针指向新的结点s
47+
r->next=s;
48+
49+
// 指针r指向新的表尾结点
50+
r=s;
51+
52+
scanf("%d",&x);
53+
}
54+
55+
// 表尾指针置空【重要】
56+
r->next=NULL;
57+
58+
// 返回单链表
59+
return L;
60+
61+
}
62+
63+
// 单链表按序号查找
64+
LNode *GetElem(LinkList L,int i){
65+
int j=1; // 查询计数,初始为1
66+
LNode *p=L->next; // 单链表头结点指针赋值给指针p
67+
68+
69+
// 第0个元素,则指向头结点,返回头结点
70+
if(i==0){
71+
// 头结点包含数据域和指针域
72+
return L;
73+
}
74+
75+
// 不等于0,却小于1,则i为负数无效,直接返回NULL,查询结果空;
76+
if(i<1){
77+
return NULL;
78+
}
79+
80+
// p存在且计数没有走到初始i的位置
81+
while(p&&j<i){
82+
83+
// 指针后移
84+
p=p->next;
85+
86+
// 计数标记+1
87+
j++;
88+
}
89+
90+
// 注意: 当p不存在时, 跳出循环,p=NULL; 当p存在但是j大于等于i,跳出循环,返回查找的结果,返回p
91+
// 从跳出循环上来分析,p要么存在即:找到的结点元素,要么为空即NULL
92+
93+
// 跳出循环,返回第i个结点的指针
94+
return p;
95+
96+
}
97+
98+
//单链表按值查找
99+
LNode *LocateElem(LinkList L,ElemType e){
100+
101+
// 指针【哨兵】
102+
LNode *p=L->next;
103+
// 从第1个结点开始查找数据域(data)为e的结点
104+
while(p!=NULL&&p->data!=e){
105+
// 无法匹配,指针后移
106+
p=p->next;
107+
}
108+
109+
// 注意:p为NULL的时候,说明单链表已经遍历的尾结点了,跳出循环,没有找到目标结点;
110+
111+
// 查找到第1个匹配的结点,跳出循环,返回结点指针
112+
return p;
113+
//
114+
}
115+

code/ds/c++版本/LinkStack.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// 链栈类型定义【基础】
2+
typedef struct LinkNode{
3+
ElemType data; // 栈元素结点数据域
4+
struct LinkNode *next; // 栈元素结点指针域
5+
} *LinkStack;
6+
7+
// 更为详细的定义
8+
9+
typedef struct StackNode
10+
{
11+
int data;//结点数据域
12+
struct StackNode* next;//结点指针域
13+
}StackNode,* LinkTop;
14+
15+
//链栈的数据结构
16+
typedef struct LinkStack
17+
{
18+
LinkTop top; //栈顶结点,定义了一个指向上个结构体的指针
19+
int count;//元素个数
20+
}LinkStack;
21+
22+
23+
// 基于单链表链栈的进栈操作
24+
bool linkStackPushNode(LinkStack* linkStack,int e){
25+
26+
// 判断链栈是否存在
27+
if (!linkStack){
28+
//链栈不存在,无法进栈操作,返回false
29+
return false;
30+
}
31+
// 开辟栈结点元素内存控件
32+
StackNode* node = (StackNode*)malloc(sizeof(StackNode));
33+
// 新结点指针域指向链表,即栈顶指针位置,元素加入链表
34+
node->next = linkStack->top;
35+
// 新结点数据域赋值
36+
node->data = e;
37+
// 元素进栈,移动栈顶指针,指向新入栈的元素
38+
linkStack->top = node;
39+
// 链栈元素总数+1
40+
linkStack->count++;
41+
//链栈入栈成功,返回true
42+
return true;
43+
}
44+
45+
46+
/*
47+
* 基于单链表链栈的出栈操作
48+
*
49+
*/
50+
bool linkStackPopNode(LinkStack* linkStack,int *e){
51+
// 判断链栈是否存在及是否为空
52+
if (!linkStack || linkStack->count==0){
53+
//出栈失败,返回false
54+
return false;
55+
}
56+
// 获取栈顶元素结点
57+
StackNode* node = stack->top;
58+
59+
// 结点元素数据域赋值给变量e
60+
*e = linkStack->data;
61+
// 移动栈顶指向,栈顶指针指向待出栈结点的后继结点
62+
linkStack->top = node->next;
63+
// 变量e已被赋值,释放链栈出栈元素的内存控件
64+
free(node);
65+
// 链栈元素个数-1
66+
linkStack->count--;
67+
// 出栈成功,返回true.
68+
return true;
69+
}

code/ds/c++版本/LoopQueue.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// 队列最大存储元素个数
2+
#define MaxSize 50
3+
4+
// 结构体定义
5+
typedef struct {
6+
// 存放队列元素
7+
ElemType data[MaxSize];
8+
// 队头指针和队尾指针
9+
int front,rear;
10+
} SqQueue;
11+
12+
// 入队算法
13+
// 尾插法:Q.data[Q.rear]=x;Q.rear=(Q.rear+1)%Maxsize;Q.tag=1
14+
// 队空条件:Q.front== Q.rear且Q.tag==0
15+
int EnLoopQueue(SqQueue &Q, ElemType x){
16+
if(Q.front==Q.rear&&Q.tag==1){
17+
return 0;
18+
}
19+
Q.data[Q.rear]=x;
20+
Q.rear=(Q.rear+1)%MaxSize;
21+
Q.tag=1;
22+
return 1;
23+
}
24+
25+
26+
27+
// 出队算法
28+
// 头结点删除:x=Q.data[Q.front];Q.front=(Q.front +1)%Maxsize;Q.tag=0
29+
// 队满条件:Q.front == Q.rear且Q.tag=1
30+
// 注意:当删除之后链表为空时,还需增加一步,将尾指针指向头结点
31+
int DeLoopQueue(SqQueue &Q, ElemType &x){
32+
if (Q.front==Q.rear&&Q.tag==0){
33+
return 0;
34+
}
35+
x=Q.data[Q.front];
36+
Q.front=(Q.front+1)%MaxSize;
37+
Q.tag=0;
38+
return 1;
39+
}
40+
41+
42+

code/ds/c++版本/QuickSort.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// 快速排序【伪代码】
2+
void QuickSort(ElemType A[] , int low , int high){
3+
// low > high 表角标越界,low=high 子表只有一个元素,不需要进行快排,已经有序
4+
if(low<high){
5+
6+
// 获取pivot基准,将当前待排序表分成左右两个子表
7+
int pivotKey = Partition(A,low,high)
8+
9+
// 对左边序列进行快排
10+
QuickSort(A,low,pivotKey-1)
11+
12+
// 对右边序列进行快排
13+
QuickSort(A,pivotKey+1,high)
14+
15+
}
16+
return A
17+
}
18+
19+
int Partition(ElemType A ,int low , int high){
20+
21+
ElemType pivot=A[low];
22+
23+
while(low<high){
24+
while(low<high && A[high]>=pivot) --high
25+
A[low]=A[high] // 比pivot小的都移到左表 注意--high 从后往前遍历
26+
27+
while(low<high && A[low]<=pivot ) ++low
28+
A[high]=A[low] // 比pivot大的都移到右表,注意++low 从前往后遍历
29+
}
30+
31+
// 此时low==high||low>high 跳出循环后即找到能将当前表一分为二的pivotKey值
32+
A[low]=pivot
33+
// 基准元素pivot对应最终的位置角标
34+
return low
35+
}

code/ds/c++版本/ShellSort.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
2+
// 希尔排序【伪代码】
3+
void ShellSort(ElemType Arr[] , int n){
4+
// k是增量
5+
for(k=n/2;k>=1;k=k/2){
6+
7+
// 增量子表进行直接插入排序
8+
for(i=k+1;i<=n;++i){
9+
10+
if(Arr[i].key<Arr[i-k].key){
11+
12+
// 元素暂存
13+
Arr[0]=Arr[i];
14+
15+
for(j=i-k;j>0&&Arr[0].key<Arr[j].key;j-=k){
16+
// 记录后移,查找插入的位置
17+
Arr[j+k]=Arr[j]
18+
}
19+
// 插入
20+
Arr[j+k]=Arr[0]
21+
}
22+
}
23+
}
24+
}
25+
26+
27+
void ShellSortEnhance(ElemType Arr[] , int n){
28+
29+
// 采用k=n/2 幂函数 确认希尔排序的步长
30+
31+
for(k=n/2;k>=1;n/=2){
32+
33+
// // 步长为k,则对应分为k个组,分别对其进行 直接插入排序
34+
35+
for(i=1,i<=k;i++){
36+
37+
// 第一步: 对应组的元素找出来,组成新的待排序的数列
38+
// 第二步: 对待排序数列进行 直接插入排序
39+
40+
specialStraightInsertSort(ElemType Arr[], int n , int k , int i)
41+
42+
}
43+
44+
}
45+
// 返回
46+
return Arr;
47+
}
48+

0 commit comments

Comments
 (0)