VisuAIgo算法可视化
参考1 常见排序算法pdf
参考2 十大排序算法
选择排序
不稳定
,例如排序 5` , 5``,2
第一趟:2,5`` ,5`
第二趟:2,5``,5`
void selection_sort(int a[], int len)
{
for(int i=0; i<len-1; i++)
{
int min_i = i;
for(int j=i+1; j<len; j++) // 遍历未排序元素
if(a[j] < a[min_i]) // 查找当前最小值
min_i = j; // 记录
int temp = a[min_i]; //交换 swap(a[min_i], a[i]);
a[min_i] = a[i];
a[i] = temp;
}
}
冒泡排序
void bubble_sort(int a[], int len)
{
bool swapped = 1; // 优化,若无交换则已经有序
for(int i=0; i<len-1 && swapped; i++) // 排序趟数
{
swapped = 0;
for(int j=0; j<len-1-i; j++) // 每趟比较次数,[len-1-i ... len-1]已经有序
if(a[j] > a[j+1]) // 相邻元素比较,逆序则交换
{
swap(a[j], a[j+1]);
swapped = 1;
}
}
}
插入排序
void insert_sort(int a[],int len)
{
// 第一个(i==0)已有序
for(int i=1; i<len; i++)
{
for(int j=i; j>0; j--) // 用待插入值(a[i])往前比较
if(a[j] < a[j-1]) // 更小则交换
swap(a[j], a[j-1]);
else
break;
}
}
int key;
for(int i=1; i<len; i++)
{
key = arr[i];
j=i-1;
while(j>=0 && arr[j]>key) // 减少交换次数
{
arr[j+1] = arr[j];
j--;
}
arr[j+1] = key;
}
二分查找插入排序:如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。
计数排序
非比较排序,小范围整数(可为负)。时间复杂度O(n+k)
// 此为简单实现:未保证稳定性
void counting_sort(int a[], int len, int min_v, int max_v)
{
//min_v = 0
int c[max_v-min_v+1] = {0}; // 计数
for(int i=0; i<len; i++)
{
c[a[i]-min_v]++;
}
int sorted_idx = 0;
for(int v=min_v; v<=max_v; v++)
{
while(c[v-min_v] > 0)
{
a[sorted_idx++] = v; // 排序
c[v-min_v]--;
}
}
}