简单排序算法

#include<iostream>
#include<assert.h>
using namespace std;

void swap(int &a, int &b)
{
	int temp = a;
	a = b;
	b = temp;
}

void BubbleSort(int arr[], int size)
{
	assert(arr);
	int flags = 0;
	//end控制每次循环的边界
	for (int end =size - 1; end > 0; --end)
	{
		flags = 0;
		for (int curr = 0; curr < end; ++curr)
		{
			//每次把最大的冒到最右边
			if (arr[curr + 1] < arr[curr])
			{
				swap(arr[curr + 1], arr[curr]);
				flags = 1;
			}
		}
		//如果没有发生过一次交换,说明已经排好了
		if (flags == 0)
			break;
	}
}

void InsertSort(int arr[], int size)
{
	assert(arr);
	for (int i = 0; i < size - 1; i++)
	{
		int j = i;
		for (; j >= 0; --j)//注意j的边界条件,因为此时是j=i,所以应是j>=0
		{
			//交换次数较多
			if (arr[j + 1] < arr[j])
				swap(arr[j + 1], arr[j]);
			else
				break;
		}
	}
}

void InsertSort_1(int arr[], int size)
{
	for (int i = 1; i < size; i++)
	{
		int tmp = arr[i];
		int curr = i-1;
		//一直移位到不满足条件,与上一个相比不用交换
		while (curr >= 0 && tmp < arr[curr])//注意边界条件
		{
			arr[curr+1] = arr[curr];
			--curr;
		}
		arr[curr+1] = tmp;//注意是arr[curr+1]=tmp
	}
}

void SelectSort(int arr[],int size)
{
	assert(arr);
	for (int i = 0; i < size-1; i++)
	{
		int min = arr[i];
		for (int j = i + 1; j < size; j++)
		{
			//最为普通的版本,交换操作过多
			if (arr[j] < min)
			{
				min = arr[j];
				arr[j] = arr[i];
				arr[i] = min;
				//swap(arr[i],arr[j]);
			}
		}
	}
}

void SelectSort_1(int arr[],int size)
{
	assert(arr);
	for (int begin = 0; begin < size - 1; ++begin)
	{
		int min_index = begin;
		for (int curr_index = begin + 1; curr_index < size; ++curr_index)
		{
			//一直找到最小值的下标,中间不需要交换
			if (arr[min_index] > arr[curr_index])
			{
				min_index = curr_index;
			}
		}
		//如果最小值不是第一个,交换
		if (min_index != begin)
		{
			swap(arr[min_index], arr[begin]);
		}
	}
}

void SelectSort_2(int arr[],int size)
{
	assert(arr);
	int begin = 0;
	int end = size - 1;

	//一次找出最大值和最小值
	while (begin < end)
	{
		int curr = begin;
		while (curr < end)
		{
			//如果比begin还小,交换
			if (arr[curr] < arr[begin])
			{
				swap(arr[curr], arr[begin]);
			}
			//如果比end还大,交换
			if (arr[curr] > arr[end])
			{
				swap(arr[curr], arr[end]);
			}
			++curr;
		}
		++begin;
		--end;
	}
}

void main()
{
	int a[] = {5,3,6,8,0,3,2,0,28,1};
	//BubbleSort(a, sizeof(a) / sizeof(a[0]));//优化版本
	//InsertSort(a, sizeof(a) / sizeof(a[0]));
	//InsertSort_1(a, sizeof(a) / sizeof(a[0]));//优化版本,把交换改成移位
	//SelectSort(a, sizeof(a) / sizeof(a[0]));
	//SelectSort_1(a, sizeof(a) / sizeof(a[0]));//优化版本,把交换改成移位(找最小值的下标)
	//SelectSort_2(a, sizeof(a) / sizeof(a[0]));//优化版本,一次循环同时找出最大值和最小值
	
	for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
	{
		cout << a[i] << "\t";
	}
	cout << endl;
}

你可能感兴趣的:(排序算法)