1.桶排序
#include<stdio.h>
#include<string.h>
int main()
{
int s[1001];
int i, j, n, num;
scanf("%d", &n);
memset(s, 0, sizeof(s));
for (i = 0; i < n; i++)
{
scanf("%d", &num);
s[num]++;//用数组下标表示待排序的数,用对应的值表示出现次数
}
printf("%lf seconds\n", Times);
for (i = 0; i < 1001; i++)
{
for (j = 0; j < s[i]; j++)
{
printf("%d ", i);//按照顺序打印出出现过的数
}
}
}
2.冒泡排序
#include<stdio.h>
int main()
{
int s[1001];
int i, j, n, t;
int change=1;
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &s[i]);
for (i = 0; i < n&&change; i++)//若没有发生交换(change=0)则说明已经有序则提前退出排序
{
change=0;
for (j = 0; j < n - i - 1; j++)
{
/*在扫描过程中顺次比较相邻的两个数据的大小,若逆序就交换位置*/
if (s[j] > s[j + 1])
{
t = s[j];
s[j] = s[j + 1];
s[j + 1] = t;
change=1;//若发生了交换,change置为1
}
}
}
printf("%lf seconds\n", Times);
for (i = 0; i < n; i++)
printf("%d ", s[i]);
}
/*通过相邻数据的交换逐步将待排序序列变成有序序列的过程(也叫相邻排序)*/
3.插入排序
#include<stdio.h>
int arr[101],n;
void InsertSort(void)
{
for (int i = 0; i < n - 1; ++i)
{
//记录有序序列最后一个有序元素的下标(一开始假设只有开头数有序)
int end = i;
//待插入的元素
int temp = arr[end + 1];
//单趟排(插入一次)
while (end >= 0)//从已排序好的最后数开始向前找,直到第一个数
{
//比待插入的数大就向后移
if (temp < arr[end])
{
arr[end + 1] = arr[end];
end--;
}
//比插入的数小,跳出循环
else
break;
}
//待插入的元素放到比插入的数小的数的后面
arr[end + 1] = temp;
}
return;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&arr[i]);
InsertSort();
for(int i=0;i<n;i++)
printf("%d ",arr[i]);
return 0;
}
/*
在待排序的元素中,假设前n-1个元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个元素有序。按照此法对所有元素进行插入,直到整个序列有序。
但我们并不能确定待排元素中究竟哪一部分是有序的,所以我们一开始只能认为第一个元素是有序的,依次将其后面的元素插入到这个有序序列中来,直到整个序列有序为止。
*/
4.选择排序
#include<stdio.h>
int arr[101],len;
void pai()
{
/*初始化左端、右端元素索引*/
int left = 0;
int right = len - 1;
while (left < right)
{
/*初始化最小值、最大值元素的索引*/
int min = left;
int max = right;
for (int i = left; i <= right; i++)
{
/*标记每趟比较中最大值和最小值的元素对应的索引min、max(优化)*/
if (arr[i] < arr[min])
min = i;
if (arr[i] > arr[max])
max = i;
}
/*最大值放在最右端*/
int temp = arr[max];
arr[max] = arr[right];
arr[right] = temp;
/*此处是先排最大值的位置,所以得考虑最小值(arr[min])在最大位置(right)的情况*/
if (min == right)
min = max;
/*最小值放在最左端*/
temp = arr[min];
arr[min] = arr[left];
arr[left] = temp;
/*每趟遍历,元素总个数减少2,左右端各减少1,left和right索引分别向内移动1*/
left++;
right--;
}
}
int main()
{
scanf("%d",&len);
for(int i=0;i<len;i++)
scanf("%d",&arr[i]);
pai();
for(int i=0;i<len;i++)
printf("%d ",arr[i]);
return 0;
}
5.快速排序
#include<stdio.h>
void quicksort(int left, int right,int s[]);
int main()
{
int s[1001];//也可以把数组和个数作为全局变量而不用每次都调用数组入函数
int i, n;
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &s[i]);
quicksort(0, n-1,s);
printf("%lf seconds\n", Times);
for (i = 0; i < n; i++)
printf("%d ", s[i]);
}
void quicksort(int left, int right, int s[])
{
int i, j, t, temp;
if (left > right)
return;
temp = s[left]; //temp中存的就是基准数
i = left;
j = right;//位置
while (i != j)
{
//顺序很重要,要先从右往左找
while (s[j] >= temp && i < j)
j--;
//再从左往右找
while (s[i] <= temp && i < j)
i++;
//交换两个数在数组中的位置
if (i < j)//当i和j没有相遇时
{
t = s[i];
s[i] = s[j];
s[j] = t;
}
}
//最终将基准数归位
s[left] = s[i];
s[i] = temp;
quicksort(left, i - 1,s);//继续处理左边的
quicksort(i + 1, right,s);//继续处理右边的
}
/*快速排序就是设定第一个值作为基准数,从右和从左分别找出小于和大于基准数的数,如果两个数的位置不相交则交换两个数的位置
(将比基准数小的数换到前面,比基准数大的换到后面),若两数相交则交换基准数和相交处的数的位置,再把这个相交的数作为基准数进行下一轮寻找*/
持续学习中~