int main() {
int a[10],i=0,j;
printf("请输入十个数字:\n");
for (; i < 10; i++) {
scanf("%d",&a[i]);
}
printf("未进行排序之前:\n");
for (i = 0; i < 10; i++) {
printf("%5d",a[i]);
};
for (int i = 0; i < 9; i++) //总共需要排序num-1次
{
int index = i; //index用于代表无序区最大值的索引
for (int j = i + 1; j < 10; j++) //遍历无序区域,找到无序区域最大值的索引
{
if (a[j] > a[index])
{
index = j;
}
}
//把无序区的最大值放到无序区域的第一个位置
if (index != i)
{
int temp = a[i];
a[i] = a[index];
a[index] = temp;
}
}
printf("\n进行排序之后:\n");
for (i = 0; i < 10; i++)
printf("%5d", a[i]);
printf("\n");
system("pause");
return 0;
}
1.桶排序
1. 知道要排序的最大的那个数 例如 M ===== int a[M+1] =0;
2.创建 int a[M+1] =0 个桶
3.出现一个数,往对应的桶里加1
4.循环打印出不==0的桶
例如: 班上有5个同学,分别考了 8,5,5,3,2. 满分为10
int main() {
int a[11] = {0},i=0,j=0,temp = 0;
for (i=0; i < 5; i++) {
printf("请输入一个数:\n");
scanf("%d",&j);
a[j]++;
}
for (i = 0; i <= 10; i++) {
for (j = 1; j <=a[i];j++)
printf("排序后:%d", i);
}
system("pause");
return 0;
}
例如:尝试 输入 n 个 0~1000之间的整数 从大到小排序
int main() {
int a[1001] = {0},i=0,j=0, n;
for (i =0; i<1001;i++) //计为m次
a[i] = 0;
scanf ("%d",&n);//输入一个数n表示接下来有n个数 // n次
for (i=0; i < n; i++) {//循环读入n个数,并进行桶排序
printf("请输入一个数:\n");
scanf("%d",&j);//把一个数读入变量j中
a[j]++;//进行计数,对编号为j的桶放一个小旗子
}
for (i = 1000; i >= 0; i--) { //依次判断 1000-0个桶 //m 次
for (j = 1; j <=a[i];j++) // n次
printf("排序后:%d", i);//出现了几次就将桶的编号打印几次
}
system("pause");
return 0;
}
时间复杂度 O = 2 (m + n) 忽略较小的常数 o = M+N
2.冒泡排序
基本思想:每次比较两个相邻的元素,如果他们的顺序错误就把他们交换
int main (){
int a[100],i,j,t,n;
scanf("%d",&n);//输入一个数,表示接下来有n个数
for (i = 0; i < n; i++) {
scanf("%d",&a[i]);
}
//核心代码
for (i=0;i<n-1;i++) {//n个数,只需要进行n-1趟
for (j=0;j< n-i;j++) {
if (a[j] < a[j+1]) {
t = a[j];
a[j] = a[j+1];
a[j + 1] = t;
}
}
}
for (i = 0; i < n; i++) {
printf("排序后:%d\n", a[i]);
}
}
3.快排
基本原理:找到一个基准数,大于基准数放在右边,小于放在左边
int a[101], n;//定义全局变量,这两个变量在子函数里会用
void quicksort(int left , int right) {
int i, j, t, temp;
if (left > right) return;
temp = a[left];//temp 中 存的是基准数字
i = left;
j = right;
while (i != j) {
//顺序很重要,要从右往左找起
while (a[j] >= temp && i < j)
j--;
//再从左边往右边找
while (a[i] <= temp && i < j)
i++;
//交换两个数在数组中的位置
if (i < j) {//当哨兵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, j;
scanf("%d",&n);
for (i = 1; i <= n; i++) {
scanf("%d",&a[i]);
}
quicksort(1,n);
for (i = 1; i <= n; i++) {
printf("%d\n",a[i]);
}
system("pause");
return 0;
}
4.选择法
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据有序。
//与冒泡的区别在于,冒泡是每每比较相邻两个数并进行交换位置。选择是先记下来,最后进行交换
int main() {
int a[10],i=0,j;
printf("请输入十个数字:\n");
for (; i < 10; i++) {
scanf("%d",&a[i]);
}
printf("未进行排序之前:\n");
for (i = 0; i < 10; i++) {
printf("%5d",a[i]);
};
for (int i = 0; i < 9; i++) //总共需要排序num-1次
{
int index = i; //index用于代表无序区最大值的索引
for (int j = i + 1; j < 10; j++) //遍历无序区域,找到无序区域最大值的索引
{
if (a[j] > a[index])
{
index = j;
}
}
//把无序区的最大值放到无序区域的第一个位置
if (index != i)
{
int temp = a[i];
a[i] = a[index];
a[index] = temp;
}
}
printf("\n进行排序之后:\n");
for (i = 0; i < 10; i++)
printf("%5d", a[i]);
printf("\n");
system("pause");
return 0;
}
5.插入排序
void insertSort(int a[], int len) {
for (int i = 1; i < len; i++) {
int tmp = a[i];
int j = i - 1;
while (j >= 0 && tmp < a[j]) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = tmp;
}
}