C++中几种排序算法小结(一)

本文介绍了三种基本的排序算法:选择排序、插入排序和希尔排序。选择排序通过每次找到最小元素与首位交换实现排序;插入排序则是将每个元素插入到已排序部分的正确位置;希尔排序则是对插入排序的优化,通过设定步长逐步减少,提高排序效率。这些排序算法是理解数据结构和算法基础的重要部分。

小结(一)

1、选择排序
首先遍历数组,找出数组中的最小的一个元素。其次,让最小元素与第一个元素交换。接着,从剩下的元素中继续重复上述步骤,最终便可得到一个有序序列。
选择排序整体思路较为简单,容易理解。

void SelectSort(int Arr[],int size)
{
	for (int i = 0; i < size-1; i++)//遍历数组下标 从0开始
	{
		int index = i;//index为下标
		for (int j = i+1; j < size; j++)
		{
			if (Arr[index]>Arr[j])
			{
				index = j;//下标交换
			}
		}
		if (i != index)
		{
			swap(Arr[i], Arr[index]);//数字交换
		}
	}
}

2、插入排序
利用插入的方式进行排序。需要说明的是:数组中的第一个元素为天然有序即从第二个元素开始排序。让已排序区域的最大一个元素与无序区域的第一个元素进行比较,若大于则不需要交换。否则就交换位置,此时有序区域有2个元素。重复上述步骤直到成为一个有序数组。需要说明的是,在有序区域也需要进行比较!!!

void InsertSort(int Arr[], int size)
{
	int temp = 0;
	int j = 0;
	for (int i = 1; i < size; i++)//插入排序认为第一个元素天然有序,从第二个元素开始
	{
		temp = Arr[i];
		j = i - 1;//已排序中最大的一个
		while (j>=0&&Arr[j]>temp)//当已排序中的最大元素大于数组中的元素的时候
		{
			Arr[j + 1] = Arr[j];//数字交换
			j--;
		}
		Arr[j + 1] = temp;
	}
}

3、希尔排序
其实就是对插入排序的优化,相比于插入排序提升了排序的效率。
首先,定义一个步长即将数组元素合数除以2,如元素个数为10,那么就分为5个组。接着,对5各组进行插入排序。然后,继续分组5/2,分为2个,此时较小的元素就处于前面的位置了,接着对2个组继续插入排序,重复上述步骤便可得到有序数组。

void ShellSort(int Arr[], int size)
{
	int step = size / 2;//步长
	int temp = 0;//定义一个临时变量
	while (step>0)
	{
		for (int i = step; i < size; i++)//插入排序
		{
			temp = Arr[i];
			int j = i - step;
			while (j>=0 && Arr[j]>temp)
			{
				Arr[j + step] = Arr[j];
				j = j - step;
			}
			Arr[j + step] = temp;
		}
		Display(Arr, size);
		step /= 2;
	}
}

4、全部程序

#include "stdafx.h"
#include<iostream>
using namespace std;

void SelectSort(int Arr[], int size);//选择排序
void InsertSort(int Arr[], int size);//插入排序
void ShellSort(int Arr[], int size);//希尔排序
void Display(int Arr[], int size);//显示结果
int _tmain(int argc, _TCHAR* argv[])
{
	int Arr[] = { 23, 46,0, 8, 11, 18 };
	int size = sizeof(Arr) / sizeof(int);

	SelectSort(Arr, size);
	InsertSort(Arr,size);
	ShellSort(Arr,size);
	
	Display(Arr, size);
	return 0;
}

void SelectSort(int Arr[],int size)
{
	for (int i = 0; i < size-1; i++)//遍历数组下标 从0开始
	{
		int index = i;
		for (int j = i+1; j < size; j++)
		{
			if (Arr[index]>Arr[j])
			{
				index = j;//下标交换
			}
		}
		if (i != index)
		{
			swap(Arr[i], Arr[index]);//数字交换
		}
	}
}

void InsertSort(int Arr[], int size)
{
	int temp = 0;
	int j = 0;
	for (int i = 1; i < size; i++)//插入排序认为第一个元素天然有序,从第二个元素开始
	{
		temp = Arr[i];
		j = i - 1;//已排序中最大的一个
		while (j>=0&&Arr[j]>temp)//当已排序中的最大元素大于数组中的元素的时候
		{
			Arr[j + 1] = Arr[j];//数字交换
			j--;
		}
		Arr[j + 1] = temp;
	}
}
void ShellSort(int Arr[], int size)
{
	int step = size / 2;//步长
	int temp = 0;//定义一个临时变量
	while (step>0)
	{
		for (int i = step; i < size; i++)//插入排序
		{
			temp = Arr[i];
			int j = i - step;
			while (j>=0 && Arr[j]>temp)
			{
				Arr[j + step] = Arr[j];
				j = j - step;
			}
			Arr[j + step] = temp;
		}
		Display(Arr, size);
		step /= 2;
	}
}
void Display(int Arr[], int size)
{
	for (int i = 0; i < size; i++)
	{
		cout << Arr[i] << "\t";
	}
	cout << endl;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值