# 数据结构与算法
**Repository Path**: zhang-wangbin/data-structure-and-algorithms
## Basic Information
- **Project Name**: 数据结构与算法
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-10-29
- **Last Updated**: 2024-10-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 数据结构与算法
---
## 查找算法
### 1. [顺序查找]()
---
## 排序算法
- 十种常见的排序算法可以分为两大类:
> **非线性时间比较排序**:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破 O(n·log(n)),因此称为非线性时间比较类排序。
>
> **线性时间非比较类排序**:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。

- 各类排序的时间复杂度:

### 1. [冒泡排序](./content/9.Sort/1_Bubble_Sort.c)
> 嵌套 for 循环实现冒泡排序,每次循环确定最大 / 最小的元素,将其排至末尾 / 开头
>
> 每次循环对相邻两位的元素进行比较
>
> 复杂度:O(n^2^)
- 流程

- 代码实现:
```c
// 冒泡排序
void bubble_sort(int arr[], int n,int flag){
int i,j; // C语言得把变量定义在for语句外面
for(i=0; i
### 2. [选择排序](content/9.Sort/2_Selection_Sort.c)
> 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
>
> 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
>
> 重复第二步,直到所有元素均排序完毕。
>
> 复杂度:O(n^2^)
- 流程:

- 代码实现:
```c
void selection_sort(int arr[],int n,int flag){
int i,j,min; // C语言得把变量定义在for语句外面
for(i=0; i
### 3. [插入排序](content/9.Sort/3_Insertion_Sort.c)
> 对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入
>
> 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
>
> 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
>
> 复杂度:O(n^2^)
- 流程

- 代码实现:
```c
// 插入排序
void insertion_sort(int arr[], int n,int flag){
int i,j; // C语言得把变量定义在for语句外面
for(i=1; i=0; j--){
if(asc_or_desc(arr[j],temp,flag)){
arr[j+1] = arr[j];
arr[j]=temp;
}
}
}
}
```
### 4. [希尔排序](content/9.Sort/4_ShellSort.c)
> 复杂度:O(n^1.3^)
- 流程

- 代码实现:
```c
void shell_sort(int arr[],int n,int flag){
int i,j,m=n/2;
while(m){
for(i=m;i=0;j-=m){
if(asc_or_desc(arr[i],arr[j],0)){
int temp=arr[j+m];
arr[j+m]=arr[j];
arr[j]=temp;
}
}
}
m/=2;
}
}
```
### 5. [归并排序](content/9.Sort/5_Merge_Sort.c)
>
>
> 复杂度:
- 流程

- 代码实现:
```c
```
### [补充排序中使用的自定义函数](content/9.Sort/head/sort.h)
- asc_or_desc 函数:用于自定义升序还是降序排序
```c
int asc_or_desc(int n,int m,int flag){
// flag=1/0 => 升序/倒序
if(flag){
return n>m;
}else{
return n