天天看点

【C++编程基础】#003 排序算法:选择排序、插入排序、冒泡排序、归并排序。

问题描述

排序是算法与数据结构中比较基础的一部分,本文利用C++语言,为大家介绍四种基础实用的排序算法:

  1. 冒泡排序 bubbleSort
  2. 选择排序 selectSort
  3. 插入排序 insertSort
  4. 归并排序 mergeSort

小伙伴们需要自取,有帮助的话可以点个赞~

注:本文中提供的代码均为完整代码,放入C++工程后可直接运行。

代码实现

#include<iostream>
#include<vector>
using namespace std;

void bubbleSort(int[],int);
void selectSort(int[], int);
void insertSort(int[], int);
void merge(int[], int, int, int);
void mergeSort(int[], int, int);
const int max = 500000;
int L[max / 2 + 2];
int R[max / 2 + 2];

int main()
{
	const int arraySize = 10;
	int a[arraySize] = { 7,5,8,9,6,3,2,1,4,6 };

	//bubbleSort(a, arraySize);
	
	for (int i = 0; i < arraySize; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;

	//electSort(a, arraySize);

	for (int i = 0; i < arraySize; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;

	//insertSort(a, arraySize);

	for (int i = 0; i < arraySize; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;



	mergeSort(a, 0, arraySize);
	for (int i = 0; i < arraySize; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;

	system("pause");
	return 0;
}


void bubbleSort(int a[],int size)
{
	int temp;
	
	for (int i = 0; i < size-1;i++)
	{
		for (int j = 0; j < size - 1 - i; j++)
		{
			if (a[j] > a[j+1])
			{
				temp = a[j];
				a[j] = a[j+1];
				a[j+1] = temp;
			}
		}
	}
}


void selectSort(int a[], int length)
{
	//每次都可以保证当前最小的数排在最前面
	int smallest;
	for (int i = 0; i < length-1; i++)
	{
		smallest = a[i];
		for (int j = i + 1; j < length; j++)
		{
			if (smallest > a[j])
			{
				smallest = a[j];
				a[j] = a[i];
				a[i] = smallest;
			}
		}
	}
}

void insertSort(int a[], int size)
{
	int temp;
	//每次循环后前i个数都是升序的,对后面的新加入的数看要插入到哪里。
	for (int i = 1; i < size; i++)
	{
		for (int j = i; j > 0 &&a[j - 1] > a[j]; j--)
		{
			temp = a[j - 1];
			a[j - 1] = a[j];
			a[j] = temp;
		}
	}
}

void mergeSort(int a[],int left, int right)
{
	if (left + 1<right)
	{
		int mid = (left + right) / 2;
		mergeSort(a, left, mid);
		mergeSort(a, mid, right);
		merge(a, left, mid, right);
	}
	
}

void merge(int a[], int left, int mid,int right)
{
	int n1 = mid - left;
	int n2 = right - mid;
	for (int i = 0; i < n1; i++)
		L[i] = a[left + i];
	for (int i = 0; i < n2; i++)
		R[i] = a[mid + i];
	L[n1] = max;
	R[n2] = max;

	int i = 0;
	int j = 0;
	for (int k = left; k < right; k++)
	{
		if (L[i] <= R[j])
		{
			a[k] = L[i++];
		}
		else
		{
			a[k] = R[j++];
		}
	}

}