总结排序方法(未完)

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);//继续处理右边的
}

/*快速排序就是设定第一个值作为基准数,从右和从左分别找出小于和大于基准数的数,如果两个数的位置不相交则交换两个数的位置
(将比基准数小的数换到前面,比基准数大的换到后面),若两数相交则交换基准数和相交处的数的位置,再把这个相交的数作为基准数进行下一轮寻找*/

持续学习中~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TGRD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值