
掌握其中几个就行,熟烂于心,比如快排,希尔排序
冒泡排序
转到冒泡排序详解
选择排序
转到选择排序讲解
插入排序
转到插入排序讲解、
希尔排序
转到希尔排序讲解
对代码加了一些注释,便于自己理解
void shellsort2(int a[], int n)
{
int j,gap;
for(gap=n/2;gap>0;gap/=2;){//步长的变化
for(j=gap;j<n;j++){//每个元素与自己组内的数据进行直接插入排序
if(a[j]<a[j-gap]){//如果当前元素小于前面的元素
int temp=a[j];//保存当前这个较小的数
int k=j-gap;//用于向前查找
while(k>=0&&a[k]>temp){//如果当前这个位置上的数比temp还大
a[k+gap]=a[k];//用这个数覆盖后面的
k-=gap;//继续向前查找
}
//退出了循环,此时k位置上的数比temp小,应该将temp放在其后面
a[k+gap]=temp;
}
}
}
}
归并排序
转到归并排序讲解
对其中的代码加了注释,便于理解
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
void merge(int a[], int l, int r, int mid)
{
int* aux = new int[r - l + 1]; int i, j, k;
//aux为开辟出来的存储空
for (k = l; k <= r; k++)
aux[k - l] = a[k];
//将a中的元素逐个复制到aux中,将来a存储最后的序列
i = l;//i为左子序列的哨兵
j = mid + 1;//j为右子序列的哨兵
for (k = l; k <= r; k++)
{//开始从左边像右边进行遍历,k为新开数组的最左边的位置,即新数组的哨兵
if (i > mid)
{//当左哨兵越过了中间线,代表左边的元素全部插入到了aux中
//开始将右边剩余的元素全部插入到aux中
a[k] = aux[j - l];
j++;//右哨兵持续向右移动
}
else if (j > r)
{//当右哨兵越过了右边的界限,代表右边的元素全部插入到了aux中
//开始将左边剩余的元素全部插入到aux中
a[k] = aux[i - l];
i++;//左哨兵持续向右移动
}
else if (aux[i - l] > aux[j - l])
{//如果左哨兵上的元素是大于右哨兵上的元素,将右边的元素插入
a[k] = aux[j - l];
j++;//右哨兵向右移动一格
}
else
{//如果左哨兵上的元素是小于右哨兵上的元素,将左边的元素插入
a[k] = aux[i - l];
i++;//左哨兵向右移动一格
}
}
}
void merge_sort(int a[], int l, int r)
{
if (l >= r)//当左边索引不小于右边索引时跳出
//就是分到每个子序列只有一个元素就不需要再分开始合并
return;
int mid = (l + r) / 2;//寻找中间位置
merge_sort(a, l, mid);//对“分”的左子序列进行处理
merge_sort(a, mid + 1, r);//对“分”的右子序列进行处理
merge(a, l, r, mid);//对分的序列进行合并
}
void mergesort(int a[], int l, int r)
{
merge_sort(a, l, r - 1);//规模减1为右边的下标
}
int main()
{
int a[105], n, i;
scanf_s("%d", &n);
for (i = 0; i < n; i++)
scanf_s("%d", &a[i]);
mergesort(a, 0, n);
for (i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;
}
快速排序
转到快速排序讲解
堆排序
就是构造相应的大根堆或者小根堆然后将根结点元素拿掉重复进行即可得到有序序列。
转到堆排序讲解
计数排序
其中对于max-min+1后面的部分可以直接输出count数组中的内容,应该不用再存储到result中
转到计数排序讲解
桶排序
转到桶排序讲解
基数排序
其中桶排序、计数、基数都差不多,掌握思想即可。