视频讲解 b站排序
插入排序、(直接排序)
就是和前边元素比较
void zhijie(int a[],int n)
{
int i,j,t;
for(i=1;i<n;i++)
{
for(j=0;j<i;j++)
{
if(a[i]<a[j])
{
int m=a[i];
a[i]=a[j];
a[j]=m;
}
}
}
}
希尔排序、
选择排序、
元素和后面的不断比较
void xuanze(int a[],int n)
{
int i=0,j=0;
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
if(a[j]<a[i])
{
int m=a[i];
a[i]=a[j];
a[j]=m;
}
}
}
}
冒泡排序、
相邻比较
void maopao(int a[],int n)
{
int i=0,j=0;
int t=0;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1])
{
int m=a[j];
a[j]=a[j+1];
a[j+1]=m;
}
}
}
}
堆排序、
快速排序
计数排序
有四个数组
累计值意义:通过数找到最终自己位置,通过c[i]+=c[i-1]计算
例如原始数组中 2 通过累计值(累计数组中的下标)找到3,说明2总共有3个,
最终结果下标从0开始,将2放在3-1下标值为2的最终位置
依次放置,最后输出最终数组
原始,计数,累计,最终
#include <stdio.h>
#include <stdlib.h>
void print_arry(int *a,int n) //打印数组
{
int i;
for(i = 0; i<n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
}
void count_sort(int *a, int *sort, int n)
{
int *count= (int *)malloc(sizeof(int) * 10);
int i;
//初始化计数数组
for(i = 0; i<10; i++)
count[i] = 0;
//统计i的次数
for(i = 0;i<n;i++)
count[a[i]]++;
//对所有的计数累加
for(i = 1; i<10; i++)
count[i] += count[i-1];
//逆向遍历源数组(保证稳定性),根据计数数组中对应的值填充到先的数组中
for(i = n; i>0; i--)
{
sort[count[a[i-1]]-1] = a[i-1];
count[a[i-1]]--;
}
free(count);
}
int main()
{
int n,i;
int *a,*sort;
printf ("输入数组大小n:");
scanf ("%d", &n);
a = (int *)malloc(sizeof(int) * n);
sort = (int *)malloc(sizeof(int) * n); //给你的数组和排序数组分配空间
for (i = 0; i<n; i++)
{
scanf("%d",&a[i]);
}
printf ("你输入的数值为0~10的数组为\n");
print_arry(a, n);
count_sort(a, sort, n);
printf ("排序后的数组:");
print_arry(sort, n);
return 0;
}
例子是0-10的引用 这位大佬的完整代码,稍有修改。
多敲敲