数据结构与算法
数据结构与算法学习
b1ackc4t
这个作者很懒,什么都没留下…
展开
-
选择排序算法
原理 先找最小的放在第一个,接着在剩余部分再找最小的放第二个以此类推 代码实现 void sort(int arr[], int n) { for (int j = 0; j < n - 1; j++) { int minPos = j; for (int i = j + 1; i < n; i++) { if (arr[i] < arr[minPos]) {原创 2022-01-25 11:08:41 · 181 阅读 · 0 评论 -
冒泡排序算法
原理 通过将相邻的数相比较,永远让大的数在右边,一轮下来就可以让最大的数像泡泡一样浮到最右边,再把最右边的去掉,对剩下的采取同样的操作,反复即可 代码实现 void sort(int *arr, int n) { for (int j = n - 1; j > 0; j--) { for (int i = 0; i < j; i++) { if (arr[i] > arr[i + 1]) {原创 2022-01-25 11:08:10 · 52 阅读 · 0 评论 -
插入排序算法
原理 类似于插扑克牌的思想,保持手上的牌都是有序的,只需要把新抽的牌插入对应位置即可,从而保证了自己不断比较的部分是有序的,减少比较成本 代码实现 void sort(int *arr, int n) { for (int i = 1; i < n; i++) { for (int j = i; j > 0; j--) { if (arr[j] < arr[j - 1]) { swap(&arr[j], &arr[j - 1]); }原创 2022-01-25 11:07:20 · 51 阅读 · 0 评论 -
希尔排序算法
原理 分组进行插入排序 比如把 1 3 4 5 6 3 2 5 9 以3为间隙分组 先排1 5 2/3 6 5/4 3 9 先在组内各自有序,然后不断的缩小间隙继续排序,直到间隙为1,成功排列完毕 代码实现 void sort(int* arr, int n) { for (int gap = n / 2; gap > 0; gap /= 2) // 2分取的间隔序列 { for (int j = gap; j < n; j++) {原创 2022-01-25 11:06:46 · 67 阅读 · 0 评论 -
快速排序算法
原理 通过选定一个基准(通常是最后一个数),把数组排成两部分,一部分全小于基准一部分全大于基准(通常采用两个指针从两头扫描,两头都扫到应在另一边的数就交换),然后对两部分分别采用同样的算法,如此递归即可排完 代码实现 int partition(int* arr, int left, int right) { int midPar = arr[right]; int lPtr = left; int rPtr = right - 1; while (lPtr <= r原创 2022-01-25 11:06:16 · 138 阅读 · 0 评论 -
计数排序算法
原理 针对于范围小数量大的数组,直接遍历一次对所有数进行计数,然后自己根据计数结果写数组 代码实现 void sort(int* arr, int n, int min, int max) //不稳定 { const int RAN = max - min + 1; int* arrRes = (int*)malloc(sizeof(int) * n); int* arrCount = (int*)malloc(sizeof(int) * RAN); //计数数组原创 2022-01-25 11:05:24 · 325 阅读 · 0 评论 -
基数排序算法
原理 把数字比较想象成每一位的多因素排序,只要保持每次排序的稳定即可,最高位权重最大最后排,这种是lsd类型,还有msd类型,通过分治递归来排序 代码实现 int getMaxBit(int* arr, int n) //找数组中最高的有几位 { int maxBit = 0; int max = arr[0]; int div = 1; for (int i = 1; i < n; i++) { if (max < arr[i]) { max = arr[i]; }原创 2022-01-25 11:04:51 · 59 阅读 · 0 评论 -
归并排序算法
原理 每次数组分成两部分,先把两部分分别排序好,再这两个有序部分归并成一个整体有序部分。通过这个归并思想用递归反复归并即可。 代码实现 void merge(int* arr, int left, int mid, int right) //归并函数 left左数组索引 mid右数组索引 right右边界索引 { int len = right - left + 1; int p1 = left; int p2 = mid; int* arrRes = (int*)malloc(sizeof(in原创 2022-01-25 11:02:47 · 1001 阅读 · 0 评论