【嵌入式学习——知识点总结】几种排序算法

1.冒泡排序

思路:从头开始比较相邻的两个数,如果前者比后者大,则进行交换。每一轮排序结束,将最大的数放到数组后面。经过多次遍历即可排除大小顺序;这种排序方法在排序的过程中,是小的数就如气泡一样逐层上浮,而使大的数逐个下沉,于是就形象地取名为冒泡排序又名起泡排序。

第一轮排序:最大数88沉到底;

在这里插入图片描述

第二轮排序:只进行4次排序,88已经沉底无需再排;

在这里插入图片描述

第三轮排序:排3次,55沉底;

在这里插入图片描述

第四轮排序:排2次,32沉底;
在这里插入图片描述

第五轮排序:排一次,15沉底,结束。
在这里插入图片描述

代码如下:

#include <stdio.h>
 
#define SIZE 6
int main()
{
    int a[SIZE]={32,54,15,5,88,67};
    int i,j,t;
    for(i=0;i<SIZE-1;i++)//n个数的数列总共扫描n-1次
    {
        for(j=0;j<SIZE-i-1;j++)//每一趟扫描到a[n-i-2]与a[n-i-1]比较为止结束
        {
            if(a[j]>a[j+1])//若后一位数比前一位数小,交换位置
            {
               t=a[j+1];
               a[j+1]=a[j];
               a[j]=t;
            }
        }
    }
 
    printf("从小到大的结果是:\n");
    for(i=0;i<SIZE;i++)
    {
 
        printf("%d ",a[i]);
    }
	printf("\n");
    return 0;
}

运行结果如下:

在这里插入图片描述

2.快速排序

思路:以某个数(假设第一个数)为基准temp,再定义两个位置头和尾分别为 i 和 j ,让 j 先开始向左动,遇到第一个小于 temp 的数停止移动,然后 i 开始向右移动遇到第一个大于 temp 的数停止移动,交换俩的位置,继续这个动作,直到 temp 左边的数小于 temp,右边的数大于 temp;然后以小于 temp 这边的第一个数为 temp 继续上述动作,直到排完左边,最后排右边;
在这里插入图片描述
1:j向左,i向右;
在这里插入图片描述
2:交换位置;
在这里插入图片描述
3:继续:
在这里插入图片描述
4:i = j ,和 temp 交换:
在这里插入图片描述
第一轮排序结束,temp左边小于它,右边大于它。
以左边为例,继续排序:

1.重新定义 i 和 j:
在这里插入图片描述

2:j向左,i向右;
在这里插入图片描述
3:交换位置;
在这里插入图片描述
4:继续:
在这里插入图片描述
5:i = j ,和 temp 交换:
在这里插入图片描述
至此,左边全部排完;右边按照同样的方法即可。

代码如下:

#include <stdio.h>
 
void Quick_Sort(int *arr, int begin, int end){
    if(begin > end)
        return;
    int tmp = arr[begin];
    int i = begin;
    int j = end;
    while(i != j){
        while(arr[j] >= tmp && j > i)
            j--;
        while(arr[i] <= tmp && j > i)
            i++;
        if(j > i){
            int t = arr[i];
            arr[i] = arr[j];
            arr[j] = t;
        }
    }
    arr[begin] = arr[i];
    arr[i] = tmp;
    Quick_Sort(arr, begin, i-1);
    Quick_Sort(arr, i+1, end);
}

int main()
{
    int arr[]={5,4,8,1,2,7,6,3,9};
    int i;
	Quick_Sort(arr,0,9);
    printf("从小到大的结果是:\n");
    for(i=0;i<9;i++)
    {
        printf("%d ",arr[i]);
    }
	printf("\n");
    return 0;
}

运行结果如下:
在这里插入图片描述

3.选择排序

思路:开始选择最小(最大)的元素,放到第一个位子,再选择次小(次大)的元素放到第二的位置,以此类推,直到排序结束。(选择排序是不稳定的排序方法)

比如我们需要排序的数字为:5,9,8,7,3,1,6,4,2
假设需要升序
第一轮:遍历9个数字,从中找出最小的数字放到第1位
排序后的结果为:1,9,8,7,3,5,6,4,2
第二轮:遍历其余8个数字,从中找出最小的数字放到第2位
排序后的结果为:1,2,8,7,3,5,6,4,9
第二轮:遍历其余7个数字,从中找出最小的数字放到第3位
排序后的结果为:1,2,3,7,8,5,6,4,9

最后,排序结果为:1,2,3,4,5,6,7,8,9
代码如下:

#include <stdio.h>
#define N 9

void in_put();
void sort();
void out_put();

int main()
{

    int a[N] = {0};
	
	int i ;
	for(i = 0;i < N;i++)
	{
        scanf("%d",&a[i]);   
    }
    sort(a,N);
    out_put(a);
	return 0;
}

void sort(int *p,int n)
{
    int i,j,min = 0;
    for(i = 0;i < N-1;i++)
    {
        min = i;
        for(j = i+1;j < N;j++)
        {
            if(p[j] < p[min])
            min = j;
        }
        if(i != min)
        {
            int temp;
            temp = p[min];
            p[min] = p[i];
            p[i] = temp;
        }
    }
}

void out_put(int *p)
{
    int i;
    for(i = 0;i<N;i++)
    {
        printf("%d,",p[i]);
    }
    printf("\n");
}

在这里插入图片描述

4.插入排序

思路:从第二个数开始,依次和其前面的所有数进行比较遇到第一个小于它的数,插到其后面,直到遍历完所有数为止。
在这里插入图片描述
以上面图片为例:
开始顺序为:3,44,38,5,47,15,36,26,27,2,46,4,19,50,48
第1次遍历结果为:3,44,38,5,47,15,36,26,27,2,46,4,19,50,48
第2次遍历结果为:3,38,44,5,47,15,36,26,27,2,46,4,19,50,48
第3次遍历结果为:3,5,38,44,47,15,36,26,27,2,46,4,19,50,48
第4次遍历结果为:3,5,38,44,47,15,36,26,27,2,46,4,19,50,48
第5次遍历结果为:3,5,15,38,44,47,36,26,27,2,46,4,19,50,48
第6次遍历结果为:3,5,15,36,38,44,47,26,27,2,46,4,19,50,48
第7次遍历结果为:3,5,15,26,36,38,44,47,27,2,46,4,19,50,48
第8次遍历结果为:3,5,15,26,27,36,38,44,47,2,46,4,19,50,48
第9次遍历结果为:2,3,5,15,26,27,36,38,44,47,46,4,19,50,48
第10次遍历结果为:2,3,5,15,26,27,36,38,44,46,47,4,19,50,48
第11次遍历结果为:2,3,4,5,15,26,27,36,38,44,46,47,19,50,48
第12次遍历结果为:2,3,4,5,15,19,26,27,36,38,44,46,47,50,48
第13次遍历结果为:2,3,4,5,15,19,26,27,36,38,44,46,47,50,48
第14次遍历结果为:2,3,4,5,15,19,26,27,36,38,44,46,47,48,50
结束

代码如下:

void InsertSort(int* arr, int n)
{
	for (int i = 0; i < n - 1; ++i)
	{
		//记录有序序列最后一个元素的下标
		int end = i;
		//待插入的元素
		int tem = arr[end + 1];
		//单趟排
		while (end >= 0)
		{
			//比插入的数大就向后移
			if (tem < arr[end])
			{
				arr[end + 1] = arr[end];
				end--;
			}
			//比插入的数小,跳出循环
			else
			{
				break;
			}
		}
		//tem放到比插入的数小的数的后面
		arr[end  + 1] = tem;
		//代码执行到此位置有两种情况:
		//1.待插入元素找到应插入位置(break跳出循环到此)
		//2.待插入元素比当前有序序列中的所有元素都小(while循环结束后到此)
	}
}

刚学习,请大家批评指正!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值