经典排序(冒泡+选择+插入)

排序方法千千万,但冒泡、选择和插入是在大学期间最常见的三种经典排序,自己也在学习的过程中有一些心得,希望能给寻求帮助的朋友带来些许帮助。

一、冒泡排序

核心思想:一次冒泡就将一个数排到最后,例如如果将一组数组按从小到大的顺序排序,第一次冒泡会把最大的数放到最后,第二次会将剩余的数中最大的数排在剩余数组的最后一位,依次循环。

若数组中有n位数,那么就需要n-1次冒泡,而在每次的冒泡过程中,实质就是两个相邻的数进行比较交换,交换的次数和当前冒泡有关,具体来说:交换的次数+当前是第几次循环=冒泡总次数。

#include<stdio.h>
void bubblesort(int arr[], int sz)
{
	int i, j;
	for (i = 0; i < sz - 1; i++)
	{
		for (j = 0; j < sz-1-i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}
int main()
{
	int arr[] = { 3,7,4,2,1,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubblesort(arr, sz);
	for (int i = 0; i < sz; i++)
		printf("%d ", arr[i]);
	return 0;
}

二、选择排序

核心思想:每趟把数组走一遍,找到当前的最大值,将其和最后一个数字进行交换,如果数组有n个数,那么就需要进行n-1次交换。

需要解决的问题:1、如何找到当前的最大值   2、找到最大值后,如何确定它在数组中的位置

#include<stdio.h>
int findmax(int arr[], int n)
{
	int i; int max = arr[0]; int pos = 0;
	for (i = 0; i < n ; i++)
	{
		if (arr[i] > max)
		{
			max = arr[i];
			pos = i;
		}
	}
	return pos;
}
void selectionsort(int arr[],int n)
{
    int pos;
	while(n>1)
	{
		pos = findmax(arr, n);
		int temp = arr[pos];
		arr[pos] = arr[n - 1];
		arr[n - 1] = temp;
		n--;
	}
}
int main()
{
	int arr[] = { 3,7,4,2,6,1 }; 
    int i;
	selectionsort(arr, 6);
	for (i = 0; i < 6 ; i++)
		printf("%d ", arr[i]);
	return 0;
}

三、插入排序

核心思想:将数组分为两部分,一部分是排好序的,还有一部分是尚未排序的,将未排好序的依次插入到有序数组的合适位置,最开始排好序的数组一般是第一个数。

#include<stdio.h>
void insert(int arr[], int n) //n表示第n个数字插到前面中去
{
	int key = arr[n]; int i = n;
    while(arr[i - 1] > key)
	{
		arr[i] = arr[i - 1];
		i--;
		if (i == 0)
		{
			break;
		}
	}
	arr[i] = key;
}
void insertionsort(int arr[], int n)
{
	int i;
	for (i = 1; i < n; i++)
	{
		insert(arr, i);
	}
}
int main()
{
	int arr[] = { 3,7,4,2,6,1 }; int i;
	insertionsort(arr, 6);
	for (i = 0; i < 6 ; i++)
	printf("%d ", arr[i]);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值