直接插入排序、希尔排序、简单选择排序、冒泡排序、快速排序、归并排序

本文详细介绍了C++中的几种基本排序算法,包括直接插入排序、希尔排序、选择排序、冒泡排序、快速排序(三种实现方式)以及归并排序,展示了它们的代码实现和工作原理。
摘要由CSDN通过智能技术生成
#include<iostream>
#include<malloc.h>
using namespace std;

//直接插入排序

void print(int a[], int n)
{
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
}

//直接插入排序

void insert(int a[], int n)
{
	int i, j;
	for (int i = 1; i < n; i++)
	{
		int k = a[i];
		for (j = i - 1; j >= 0 && a[j] > k; j--)
		{
			a[j + 1] = a[j];
		}
		a[j + 1] = k;
	}

}

//希尔排序
void shellSort(int a[], int n)
{
	int gap = 3;
	int i, j;
	while (gap--)
	{
		for (i = gap; i < n; i++)
		{
			int k = a[i];
			for (j = i - gap; j >= 0 && a[j] > k; j -= gap)
			{
				a[j + gap] = a[j];
			}
			a[j + gap] = k;
		}
	}
}


//简单选择排序
void selectSort(int a[], int n)
{
	int i, j,min;
	for (i = 0; i < n - 1; i++)
	{
		min = i;;
		for (j = i + 1; j < n; j++)
		{
			if (a[j] < a[min])
			{
				min = j;
			}
		}
		if (min != i)
		{
			int temp = a[i];
			a[i] = a[min];
			a[min] = temp;  //注意交换的是元素,而不是下标
		}
	}
}

//冒泡排序
void bubbleSort(int a[], int n)
{
	int i, j;
	for (i = 0; i < n-1; i++)
	{
		int flag = 0;
		for (j = 0; j < n - 1 - i; j++)
		{
			if (a[j] > a[j + 1])   //注意此处是大于
			{
				int temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
				flag = 1;
			}
		}

		if (flag == 0)
		{
			break;
		}

	}

}


//快速排序方法一
//左闭右开[ )
void quickSort(int a[], int low,int high)
{
	if (low + 1 >= high)
	{
		return;
	}
	int i, j;
	int begin = low;
	int end = high - 1;
	int key = a[begin];
	while (begin < end)
	{
		while (begin < end && a[end] >= key)
		{
			end--;
		}
		a[begin] = a[end];
		while (begin < end && a[begin] <= key)
		{
			begin++;
		}
		a[end] = a[begin];
	}
	a[begin] = key;
	quickSort(a, low, begin);
	quickSort(a, begin+1,high);
}

//快速排序方法二
void quickSort2(int a[], int low,int high)
{
	if (low + 1 >= high)
	{
		return;
	}
	int i, j;
	int begin = low;
	int end = high-1;
	int key = a[begin];
	while (begin < end)
	{
		while (begin < end && a[end] >= key)
		{
			end--;
		}
		while (begin < end && a[begin] <= key)
		{
			begin++;
		}
		int temp = a[begin];
		a[begin] = a[end];
		a[end] = temp;
	}
	a[begin] = key;
	quickSort(a, low, begin);
	quickSort(a, begin + 1, high);

}

void swap(int* a, int* b)
{
	int t = *a;
	*a = *b;
	*b = t;
}


//快速排序方法三——快慢指针法
void quickSort3(int a[], int low, int high)
{
	if (low + 1 >= high)
	{
		return;
	}
	int i, j;
	int begin = low;
	int end = high - 1;

	int key = a[begin];
	int prev = begin;
	int cur = begin + 1;
	while (cur <= end)
	{
		// cur找小,把小的往前翻,大的往后翻
		if (a[cur] < key && ++prev != cur)
			swap(&a[cur], &a[prev]);
		++cur;
	}
	 swap(&a[begin], &a[prev]);
	quickSort(a, low, begin);
	quickSort(a, begin + 1, high);

}


//归并排序
void merge(int a[], int m, int mid, int n)
{
	int begin1 = m; 
	int begin2 = mid + 1;
	int end1 = mid;
	int end2 = n;
	int* temp = (int*)malloc((n + 1) * sizeof(int));
	int k = 0;
	while (begin1 <= end1 && begin2 <= end2)
	{
		if (a[begin1] <= a[begin2])
		{
			temp[k++] = a[begin1++];
		}
		else
		{
			temp[k++] = a[begin2++];
		}

	}
	while (begin1 <= end1)
	{
		temp[k++] = a[begin1++];
	}
	while (begin2 <= end2)
	{
		temp[k++] = a[begin2++];
	}

	for (int i = 0; i < k; i++)
	{
		a[m+i] = temp[i]; //注意此处!!
	}
	free(temp);
}

void mergeSort(int a[], int m,int n)
{
	if (m < n)
	{
		int mid = m + (n - m) / 2;  //注意此处是n-m !!!
		mergeSort(a, m, mid);
		mergeSort(a, mid + 1, n);
		merge(a, m, mid, n);
	}
	
}


int main()
{
	int a[] = { 1,3,5,7,9,2,4,6,8,10 };
	print(a, 10);
	//insert(a, 10);
	//shellSort(a, 10);
	//selectSort(a, 10);
	//bubbleSort(a, 10);
	//quickSort(a, 0, 10);
	//quickSort2(a, 0, 10);
	quickSort3(a, 0, 10);
	//mergeSort(a, 0, 9);
	print(a, 10);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值