《啊哈,算法》第一节
作者:互联网
一、排序
1、桶排序(简化版)
如:对 5,3,5,2,8 进行排序
初始化:申请一个大小为10的数组 int a[10],并将a[0]~a[10]初始化为0;
for (i = 0; i <= 10; i++)
{
a[i] = 0;
}
记录次数:进行for循环,用a[i]的值记录5,3,5,2,8这几个数出现的次数;
for (i = 1; i <= 10; i++)
{
scanf("%d", &t);
a[t]++;
};
输出:
- for (i = 0; i <= 10; i++)代表从小到大输出
// 从小到大
for (i = 0; i <= 10; i++)
{
for (j = 1; j <= a[i]; j++)
{
printf("%d ", i);
}
}
- for (i = 10; i >= 0; i–)代表从大到小输出
// 从大到小
for (i = 10; i >= 0; i--)
{
for (j = 1; j <= a[i]; j++)
{
printf("%d ", i);
}
}
2、冒泡排序
核心思想:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来
如:对 5,3,5,2,8进行排序
第一位需要执行4次交换,第二位需要执行3次交换,第三位需要执行2次交换,第四位需要执行1次交换,一共4趟;
总结:n个数,需要n-1趟,第i趟执行n-i次交换。
for (i = 1; i <= n - 1; i++) // 外层决定趟数
{
for (j = 1; j <= n - i; j++) // 内层决定交换次数
{
if (a[j] < a[j + 1]) //对相邻的数进行交换
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
3、快速排序
对 6 1 2 7 9 3 4 5 10 8 这10个数进行排序
首先在这个序列中随便找一个数作为基准数,这里把6作为基准数,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在 6的左边,如下:
实现方法:
- 初始化数组
int a[10] = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
- 初始化基准数
int temp = a[1];
- 初始化两个变量
int i = 1 , j =10;
- 先让
j--
,当移动到大于6的数,再让i++
,当移动到小于6的数时,将a[i],a[j]
进行交换;
while (i != j)
{
while (a[j] >= temp && j > i)
{
j--;
};
while (a[i] <= temp && i < j)
{
i++;
}
if (i < j)
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
当i与j重合时,再将a[i]=a[j]
与temp
进行交换
然后再对6两边的序列进行相同的处理;
根据该思想封装的函数如下:
// 4_快速排序
#include <stdio.h>
int a[101], n;
void quicksort(int left, int right)
{
int i, j, t, temp;
if (left > right) // 结束递归的条件
{
return;
}
temp = a[left];
i = left;
j = right;
while (i != j)
{
while (a[j] >= temp && j > i)
{
j--;
};
while (a[i] <= temp && i < j)
{
i++;
}
if (i < j)
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
a[left] = a[i]; a[i] = temp;
quicksort(left, i - 1); // 处理基准数左边的
quicksort(i + 1, right); // 处理基准数右边的
return;
}
int main()
{
int i;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
quicksort(1, n);
for (i = 1; i <= n; i++)
{
printf("%d ", a[i]);
}
return 0;
}
标签:10,temp,int,第一节,while,算法,啊哈,排序,left 来源: https://blog.csdn.net/qq_45467524/article/details/121305169