嵌入式(c)排序算法

直接插入排序

#include <stdio.h>
/*
直接插入排序:
思想:
    从第二个元素开始,将后一个元素依次跟前面所有的元素进行比较,选择一个合适
    的位置插入,然后再将第三个元素依次跟前面所有的元素进行比较,选择一个合适
    的位置插入,如此循环,最终序列将整体有序。
*/
void InsertSort(int *p,int len)
{
    int temp = 0;
    int j = 0;
    for (int i = 1; i < len; i++)
    {
        temp = p[i];
        for (j = i - 1; j >= 0; j--)
        {
            if (temp < p[j])
            {
                p[j + 1] = p[j];
            }
            else
            {
                break;
            }
        }
        p[j+1] = temp;
    }
    return 0;
}
int main(void)
{
    int arr[10] = { 5,4,6,7,8,2,1,3,9,0 };
    int len = sizeof(arr) / sizeof(arr[0]);
    InsertSort(arr, len);
    for (int i = 0; i < len; i++)
    {
        printf("%d ", arr[i]);
    }
    putchar(10);
    return 0;
}

希尔排序

#include <stdio.h>
/*
希尔排序:
特点:
1.分组排序,避免数据在内存中的大面积移动
2.多组同时进行排序
*/
void ShellSort(int *p,int len)
{
    int temp = 0;
    int j = 0;
    //以h为增量进行分组排序
    for (int h = len / 2; h >= 1; h /= 2)
    {
        //从第一组的第二个元素开始跟前面所有的元素进行比较
        for (int i = h; i < len; i++)
        {
            //将要比较的元素赋值给temp
            temp = p[i];
            //以增量h为间隔,前面组内的元素进行比较
            for (j = i - h; j >= 0; j -= h)
            {
                if (temp < p[j])
                {
                    p[j + h] = p[j];
                }
                else
                {
                    break;
                }
            }
            p[j + h] = temp;
        }

    }
}
int main(void)
{
    int arr[10] = { 5,4,6,7,8,2,1,3,9,0 };
    int len = sizeof(arr) / sizeof(arr[0]);
    ShellSort(arr, len);
    for (int i = 0; i < len; i++)
    {
        printf("%d ", arr[i]);
    }
    putchar(10);
    return 0;
}

冒泡排序

#include <stdio.h>
/*
冒泡排序:
交换排序中的一种:
思路:从第一个元素开始,两两进行比较,以升序
      排序为例,如果前面的元素比后面大,则交换之
      通过一趟排序后,最大值交换至数组的末尾。
      第二趟排序,将次大值交换至数组的倒数第二的位置
      如此循环,则序列将整体有序。
*/
/*
一维数组的传参:
    传指针 + 数组的长度
    因为函数内部无法获取数组的大小
传参格式:
1.传指针:int *p,int length
2.传原型  int p[10],int length
3.传缺省的数组  int p[],int length
*/
//void BubbleSort(int *p,int length)
//void BubbleSort(int p[100], int length)  //此处p相当于一个int*的指针
void BubbleSort(int p[], int length)
{
    //printf("sizeof(p) = %lld\n",sizeof(p));
    for (int i = 0; i < length - 1; i++)
    {
        for (int j = 0; j < length - 1 - i; j++)
        {
            if (p[j] > p[j + 1])
            {
                p[j] = p[j] + p[j + 1];
                p[j+1] = p[j] - p[j + 1];
                p[j] = p[j] - p[j + 1];
            }
        }
    }
}
int main(void)
{
    int arr[10] = { 5,4,6,7,8,2,1,3,9,0 };
    int len = sizeof(arr) / sizeof(arr[0]);
    BubbleSort(arr,len);
    for (int i = 0; i < len; i++)
    {
        printf("%d ",arr[i]);
    }
    putchar(10);
    return 0;


简单选择排序

void SelectSort(int* a, int len)
{
	int temp = a[0];
	int index = 0;
	for (int i = 0; i < len - 1; i++)
	{
		temp = a[i];
		index = i;
		for (int j = i + 1; j < len; j++)
		{
			if (a[j] < temp)
			{
				temp = a[j];
				index=j;
			}
		}
		if (index != i)
		{
			a[index] = a[i];
			a[i] = temp;
		}
	}

}

快速排序

void QuickSort(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);
}

排序(大根堆)堆

//调整大顶堆
void AdjustHeapSort(int* a, int root, int last)
{
	int child = 2 * root + 1;
	for (; 2 * root + 1 <= last; root = child)
	{
		child = 2 * root + 1;
		if ((child + 1 <= last) && (a[child] < a[child + 1]))
		{
			child++;

		}
		if (a[child] > a[root])
		{
			a[child] = a[child] ^ a[root];
			a[root] = a[child] ^ a[root];
			a[child]= a[child] ^ a[root];
		}
	}
}
void swap(int* x, int* y)
{
	*x = *x + *y;
	*y = *x - *y;
	*x = *x - *y;
}
void HeapSort(int* a, int length)
{
	//构建大根堆
	for (int i = length / 2 - 1; i >= 0; i--)
	{
		AdjustHeapSort(a, i, length - 1);
	}
	//调整大根堆
	for (int i = length- 1; i >= 0; i--)
	{
		swap(&a[0], &a[i]);
		AdjustHeapSort(a, 0, i - 1);
	}

}

main.c

int main(void)
{
	int arr[10] = { 3,4,6,7,9,8,5,1,0,2 };
	int len = sizeof(arr) / sizeof(arr[0]);
	SelectSort(arr, len);
	for (int i = 0; i < len; i++)
	{
		printf("%d ", arr[i]);
	}
	putchar(10);
	return 0;
}

归并排序

void merge(int* a, int start, int mid, int end)
{
	int Left_len = mid - start + 1;
	int Right_len = end - mid;
	int* L = (int*)malloc(sizeof(int) * Left_len);
	int* R = (int*)malloc(sizeof(int) * Right_len);
	if (NULL == L || NULL == R)
	{
		printf("malloc failure!\n");
		return;
	}
	//左边的数循环放在左边
	int k = start;
	for (int i = 0; i < Left_len; i++, k++)
	{
		L[i] = a[k];
	}
	//右边的数循环放在右边
	for (int j = 0; j < Right_len; j++, k++)
	{
		R[j] = a[k];
	}

	k = start;
	int i = 0, j = 0;
	for (i = 0, j = 0; i < Left_len && j < Right_len; k++)
	{
		if (L[i] < R[j])
		{
			a[k] = L[i++];
		}
		else
		{
			a[k] = R[j++];
		}

	}
	if (i < Left_len)
	{
		for (; i < Left_len; i++, k++)
		{
			a[k] = L[i];
		}
	}
	if (j < Right_len)
	{
		for (; j < Right_len; j++, k++)
		{
			a[k] = R[j];
		}
	}
	free(L);
	free(R);
}
void MergeSort(int* a, int start, int end)
{
	if(start>=end)
	{
		return;
	}
	int mid = (start + end) / 2;//拆分
	MergeSort(a, start, mid);
	MergeSort(a, mid+1, end);//合并
	merge(a, start, mid, end);

}

基数排序

void RadixSort(int* a, int length)
{
	//第一步找出最大值
	int max = a[0];
	int base = 1;
	for (int i = 0; i < length; i++)
	{
		if (max < a[i])
		{
			max = a[i];
		}
	}
	//用于个十百位=出现的次数以及每个数存放的位置
	int bucket[10] = { 0 };
	int* t = (int*)malloc(sizeof(int) * length);
	if (t == NULL)
	{
		printf("malloc failure!\n");
		return;
	}
	int count = 0;
	while (max / base > 0)
	{
		for (int i = 0; i < length; i++)
		{
			//依次收集个,十,百位等出现的次数
			bucket[(a[i] / base) % 10]++;
		}
		//确定每个元素所存在的位置
		for (int i=1; i < 10; i++)
		{
			bucket[i] += bucket[i - 1];
		}
		for (int i = length - 1; i>=0; i--)
		{
			t[bucket[a[i] / base % 10] - 1] = a[i];
			bucket[a[i] / base % 10]--;
		}
		for (int i = 0; i < length; i++)
		{
			a[i] = t[i];
		}
		base *= 10;
		memset(bucket, 0, sizeof(bucket));
	}
	printf("count=%d\n", count);
	free(t);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值