微网站建设教程视频教程/公司企业网站制作需要多少钱
一个不知名大学生,江湖人称菜狗
original author: jacky Li
Email : 3435673055@qq.comTime of completion:2023.3.1
Last edited: 2023.3.1导读:
帮助算法设计初学者快速掌握算法设计,帮助安静对ABCD……等的重要性排序更清晰!
目录
算法设计与分析—十大经典排序算法二(6--10)
第6关:快速排序
参考代码
第7关:堆排序
参考代码
第8关:计数排序
参考代码
第9关:桶排序
参考代码
第10关:基数排序
参考代码
作者有言
算法设计与分析——十大经典排序算法二(6--10)
第6关:快速排序
任务描述
本关任务:实现快速排序算法,并将乱序数列变成升序。
相关知识
为了完成本关任务,你需要掌握:1.快速排序算法。
快速排序算法
快速排序是最常用的一种排序算法,它的特点是速度快、效率高。快速排序的基本思想:选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选择序列的第一个元素作为基准值。
-
算法步骤:
-
从数列中挑出一个元素,称为
基准pivot
; -
分区
partition
操作:比基准值小的元素放在左边,比基准值大的元素放在右边; -
递归
recursive
:把小于基准值元素的子数列和大于基准值元素的子数列分别递归排序。
-
编程要求
本关的编程任务是补全右侧代码片段partition_array
和quick_sort
中Begin
至End
中间的代码,具体要求如下:
- 在
partition_array
中,实现数组分区:选定一个基准,左边比基准小,右边比基准大,返回基准所处位置。 - 在
quick_sort
中,实现快速排序:自上而下的递归方法。
测试说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
以下是平台的测试样例:
测试输入:
10
7 1 4 6 8 9 5 2 3 10
预期输出:
1 2 3 4 5 6 7 8 9 10
测试输入:
15
3 44 38 5 47 15 36 26 27 2 46 4 19 50 48
预期输出:
2 3 4 5 15 19 26 27 36 38 44 46 47 48 50
参考代码
#include "sort_.h"void print_array(int *arr, int n)
{if(n==0){printf("ERROR: Array length is ZERO\n");return;}printf("%d", arr[0]);for (int i=1; i<n; i++) {printf(" %d", arr[i]);}printf("\n");
}int partition_array(int *arr ,int l,int r){int a = arr[l];int q = l;int e = r;while(q != e){while(e > q && arr[e]>= a){e--;}while(e > q && arr[q] <= a){q++;}if(q < e){swap(arr[q],arr[e]);}}arr[l]= arr[q];arr[q] = a;return q;
}int* quick_sort(int *arr, int l, int r)
{if(l<r){int a = partition_array(arr ,l,r);quick_sort(arr,l , a);quick_sort(arr, a+1, r);return arr;}
}
第7关:堆排序
任务描述
本关任务:实现堆排序算法,并将乱序数列变成升序。
相关知识
为了完成本关任务,你需要掌握:1.堆排序算法。
堆排序算法
堆排序Heapsort
是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
-
算法步骤:
-
将初始待排序关键字序列
(R1,R2….Rn)
构建成大顶堆,此堆为初始的无序区; -
将堆顶元素
R[1]
与最后一个元素R[n]
交换,此时得到新的无序区(R1,R2,……Rn-1)
和新的有序区(Rn)
,且满足R[1,2…n-1]<=R[n]
; -
由于交换后新的堆顶
R[1]
可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)
调整为新堆,然后再次将R[1]
与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)
和新的有序区(Rn-1,Rn)
。不断重复此过程直到有序区的元素个数为n-1
,则整个排序过程完成。
-
编程要求
本关的编程任务是补全右侧代码片段adjustHeap
和heap_sort
中Begin
至End
中间的代码,具体要求如下:
- 在
adjustHeap
中,实现堆的调整。 - 在
heap_sort
中,构建大顶堆,并调用adjustHeap
实现堆的调整。
测试说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
以下是平台的测试样例:
测试输入:
10
7 1 4 6 8 9 5 2 3 10
预期输出:
1 2 3 4 5 6 7 8 9 10
测试输入:
15
3 44 38 5 47 15 36 26 27 2 46 4 19 50 48
预期输出:
2 3 4 5 15 19 26 27 36 38 44 46 47 48 50
参考代码
#include "sort_.h"void print_array(int *arr, int n)
{if(n==0){printf("ERROR: Array length is ZERO\n");return;}printf("%d", arr[0]);for (int i=1; i<n; i++) {printf(" %d", arr[i]);}printf("\n");
}void adjustHeap(int *arr, int param1, int j)
{int a = arr[param1]; int child = 2*param1 + 1; while(child < j){if(child + 1 < j && arr[child] < arr[child+1 ])child++;if(a >= arr[child])break;arr[param1] = arr[child];param1 = child;child = 2*child +1;}arr[param1] = a;
}int* heap_sort(int *arr, int n)
{for(int i = n / 2 - 1; i >= 0; i --)adjustHeap(arr, i, n);for(int i = n - 1; i > 0; i --){swap(arr[0],arr[i]);adjustHeap(arr,0, i);}return arr;
}
第8关:计数排序
任务描述
本关任务:实现计数排序算法,并将乱序数列变成升序。
相关知识
为了完成本关任务,你需要掌握:1.计数排序算法。
计数排序算法
计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
-
算法步骤:
-
找出待排序的数组中最大和最小的元素;
-
统计数组中每个值为
i
的元素出现的次数,存入数组C
的第i
项; -
对所有的计数累加(从
C
中的第一个元素开始,每一项和前一项相加); -
反向填充目标数组:将每个元素
i
放在新数组的第C(i)
项,每放一个元素就将C(i)
减去1
。
-
编程要求
本关的编程任务是补全右侧代码片段sort_array
中Begin
至End
中间的代码,具体要求如下:
- 在
sort_array
中,实现计数排序算法,完成指定输出。
测试说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
以下是平台的测试样例:
测试输入:
10
7 1 4 6 8 9 5 2 3 10
预期输出:
1 1
2 1
3 1
4 1
5 1
6 1
7 1
8 1
9 1
10 1
1 2 3 4 5 6 7 8 9 10
参考代码
#include "sort_.h"void print_array(int *arr, int n)
{if(n==0){printf("ERROR: Array length is ZERO\n");return;}printf("%d", arr[0]);for (int i=1; i<n; i++) {printf(" %d", arr[i]);}printf("\n");
}void sort_array(int *arr, int n)
{int max = 0, s;for(s = 0; s < n; s ++)if(max<arr[s])max=arr[s];int min = 0x3f3f3f3f;for(s=0;s<n;s++)if(min>arr[s])min=arr[s];int arrLen = max-min+1;int *jishu = new int[arrLen];fill(jishu, jishu + arrLen, 0);for(int i = 0; i < n; i ++)jishu[arr[i] - min] += 1;int index = 0;for(int i = 0; i < arrLen; i ++)if(jishu[i] != 0)printf("%d %d\n", i + min, jishu[i]);for(int i = 0; i < arrLen; i ++)while(jishu[i] != 0){arr[index] = i+min;jishu[i] --;index ++;}print_array(arr, n);
}
第9关:桶排序
任务描述
本关任务:实现桶排序算法,并将乱序数列变成升序。
相关知识
为了完成本关任务,你需要掌握:1.桶排序算法。
桶排序算法
桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。
-
算法步骤:
-
设置一个定量的数组当作空桶;
-
遍历输入数据,并且把数据一个一个放到对应的桶里去;
-
对每个不是空的桶进行排序;
-
从不是空的桶里把排好序的数据拼接起来。
-
编程要求
本关的编程任务是补全右侧代码片段sort_array
中Begin
至End
中间的代码,具体要求如下:
- 在
sort_array
中,实现桶排序算法,并返回升序的数组。
测试说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
以下是平台的测试样例:
测试输入:
10
7 1 4 6 8 9 5 2 3 10
预期输出:
1 2 3 4 5 6 7 8 9 10
测试输入:
15
3 44 38 5 47 15 36 26 27 2 46 4 19 50 48
预期输出:
2 3 4 5 15 19 26 27 36 38 44 46 47 48 50
参考代码
#include "sort_.h"void print_array(int *arr, int n)
{if(n==0){printf("ERROR: Array length is ZERO\n");return;}printf("%d", arr[0]);for (int i=1; i<n; i++) {printf(" %d", arr[i]);}printf("\n");
}int* sort_array(int *arr, int n)
{int max = 0, s;for(s = 0; s < n; s ++)if(max<arr[s])max=arr[s];int min = 0x3f3f3f3f;for(s=0;s<n;s++)if(min>arr[s])min=arr[s];int bucketNum = (max - min) / n + 1;int *bucket = new int[bucketNum * n];int *bucketIndex = new int[bucketNum];fill(bucketIndex, bucketIndex + bucketNum, -1);for(int i = 0; i < n; i ++){int index = arr[i] / (n + 1);bucketIndex[index] ++;bucket[index * n + bucketIndex[index]] = arr[i];}for(int i = 0; i < bucketNum; i ++)if(bucketIndex[i] != -1)sort(bucket + i * n, bucket + i * n + bucketIndex[i] + 1);int index = 0;for(int i=0;i<bucketNum;i++){int a = 0;while(bucketIndex[i]>=0){arr[index] = bucket[i*n + a];a++;index++;bucketIndex[i]--;}}return arr;
}
第10关:基数排序
任务描述
本关任务:实现基数排序算法,并将乱序数列变成升序。
相关知识
为了完成本关任务,你需要掌握:1.基数排序算法。
基数排序算法
基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。
-
算法步骤:
-
取得数组中的最大数,并取得位数;
-
arr
为原始数组,从最低位开始取每个位组成radix
数组; -
对
radix
进行计数排序(利用计数排序适用于小范围数的特点);
-
编程要求
本关的编程任务是补全右侧代码片段sort_array
中Begin
至End
中间的代码,具体要求如下:
- 在
sort_array
中,实现基数排序算法,并返回升序的数组。
测试说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
以下是平台的测试样例:
测试输入:
10
7 1 4 6 8 9 5 2 3 10
预期输出:
1 2 3 4 5 6 7 8 9 10
测试输入:
15
3 44 38 5 47 15 36 26 27 2 46 4 19 50 48
预期输出:
2 3 4 5 15 19 26 27 36 38 44 46 47 48 50
参考代码
#include "sort_.h"void print_array(int *arr, int n)
{if(n==0){printf("ERROR: Array length is ZERO\n");return;}printf("%d", arr[0]);for (int i=1; i<n; i++) {printf(" %d", arr[i]);}printf("\n");
}int* sort_array(int *arr, int n)
{int max = 0, s;for(s = 0; s < n; s ++)if(max < arr[s])max = arr[s];int *radix = new int[n * 10];fill(radix, radix + n * 10, 0);int *tmparr = new int[n];for(int i = 0; i < n; i ++)tmparr[i] = arr[i];int jishu[10];fill(jishu, jishu + 10, -1);int wei = 0;while(max > 0) max /= 10, wei ++;for(int i=1;i<=wei;i++){int dev = 1;for(int j = 1; j < i; j ++)dev *= 10;for(int j = 0; j < n; j ++){int index = arr[j] / (dev) % (10);jishu[index] ++;radix[index * n + jishu[index]] = arr[j];}int ind = 0;for(int k = 0; k < 10; k ++)if(jishu[k] >= 0){sort(radix + k * n, radix + k * n + jishu[k] + 1);for(int j = 0; j < jishu[k] + 1; j ++)arr[ind] = radix[k * n + j], ind ++;jishu[k] = -1;}fill(radix, radix + n * 10, 0);}return arr;
}
作者有言
如果感觉博主讲的对您有用,请点个关注支持一下吧,将会对此类问题持续更新……