C语言数据结构八:排序算法:冒泡排序;选择排序;插入排序;

冒泡排序:

内外循环:如果前一个数比后一个数大或者小,则交换顺序。

核心:嵌套循环+比较+交换。

多次比较,多次交换。内循环多次交换导致搬运影响时间。 

void MyBubbleSort(int* p, int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len-i-1; j++)
		{
			if ((*(p + j)) < (*(p + j + 1)))
			{
				int temp = *(p + j);
				*(p + j) = *(p + j + 1);
				*(p + j + 1) = temp;
			}
		}
	}
}

选择排序:

假定起始位置为最值。然后内外循环,如果发现一个值比最值还最,那么记录这个位置。等循环结束交换他俩的位置。

核心:多次比较,但是每次内循环玩只搬运一次。比冒泡搬运少。

算是冒泡的改良版。 

void Selectsort(char **arr,int len)
{	
	for (int i = 0; i < len; ++i)
	{
		int min = i;  // 标记最值下标索引。

		for (int j = i + 1; j < len; ++j)
		{
			//arr[j]>arr[min]就返回大于0,
			//现在是从大到小排序
			if (strcmp(arr[j], arr[min])>0)
			{
				min = j;
			}
		}
        // 每次循环只交换一次
		char *temp = arr[i];
		arr[i] = arr[min];
		arr[min] = temp;
	}
}

插入排序:

思路:将无序序列中的元素逐个插入到有序序列中。

从思路看,需要两个序列,一个无序序列,一个有序序列。无序序列就是待排序序列,这个有序序列从哪里来?

如何构建有序序列?

我们初始化时,将第一个元素作为有序序列。

此时,下标遍历从1开始。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void printArray(int arr[],int len)
{
	for (int i = 0; i < len; ++i)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
}


void InsertSort(int arr[],int len)
{

	for (int i = 1; i < len; ++i)
	{

		if (arr[i] > arr[i - 1])
		{
			int temp = arr[i];
			int j = i - 1;
			for (; j >= 0 && temp > arr[j]; j --)
			{
				arr[j + 1] = arr[j];
			}

			arr[j + 1] = temp;

		}

	}

}


void  test()
{
	int arr[] = { 5, 3, 9, 2, 1, 3 };
	int len = sizeof(arr) / sizeof(int);
	printArray(arr, len);
	InsertSort(arr, len);
	printArray(arr, len);
}

int main(){

	test();

	system("pause");
	return EXIT_SUCCESS;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值