排序算法代码实现

八种排序算法

#include<iostream>
#include<cstdlib>
#include<stdio.h>
#include<time.h>
#include<vector>
#include<list>
using namespace std;
void Print(int* array, int len)
{
		for (int i = 0; i < len; ++i)
		{
			printf("%d ",array[i]);
		}
		cout << endl;
}
//1.插入排序
void Insert_Sort(int* arr, int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		int end = i;
		int key = arr[end+1];
		//从end向前找比key大的,直到找到一个key小的跳出循环插入
		while (key < arr[end]&&end>=0)
		{
			arr[end+1] = arr[end];
			--end;
		}
		arr[end+1] = key;
	}
}

//2.希尔排序
void Shell_Sort(int* array, int len)
{
	//确定gap,表示一步多长
	int gap = len;
	//多轮插入排序
	while(gap>1)
	{
		gap = gap / 3 + 1;
		//一轮插入排序,步长为gap
		for (int i = 0; i < len-gap; ++i)
		{
			int end = i;
			int key = array[end + gap];
			while (end >= 0 && key < array[end])
			{
				array[end + gap] = array[end];
				end -= gap;
			}
			array[end + gap] = key;
		}
	}
}

//3.选择排序
//交换函数
void Swap(int* array, int left, int right)
{
	int temp = array[left];
	array[left] = array[right];
	array[right] = temp;
}
void Select_Sort(int* array, int len)
{
	//从待排序序列中找出最小的数然后和已排序的数的后一位进行交换
	for (int i = 0; i < len; i++)
	{
		int end = i;
		int min = end;
		for (int j = end + 1; j < len; j++)
		{
			if (array[j] < array[min])
			{
				min = j;
			}
		}
		Swap(array, min, i);
		
	}
}

//4.冒泡排序
void Bubble_Sort(int* array, int len)
{
	for (int i = len - 1; i >= 0; i--)
	{
		int flag = 1;//此处的标记是为了防止已经排序的数列,可以提前退出,减少运算
		for (int j = 0; j < i; j++)
		{
			//两两比较,将最大的交换和下一个进行比较,最后完成排序
			if (array[j] > array[j + 1])
			{
				flag = 0;
				Swap(array, j, j + 1);
			}
		}
		if (flag)
		{
			break;
		}
	}
}
//5.堆排序
//大堆的调整
void Heap_ShiftDown(int* array, int n, int parent)
{
	int children = 2 * parent + 1;
	while (children < n)
	{
		//左右子树取较大值,和父节点进行比较
		if (children + 1 < n && array[children + 1] > array[children])
		{
			++children;
		}
		if (array[parent] < array[children])
		{
			Swap(array, parent, children);
			parent = children;
			children = 2 * children + 1;

		}
		else
			break;
	}
}

void Heap_Sort(int* array, int len)
{
	//第一步:建堆
	for (int i = (len - 2) / 2; i >= 0; i--)
	{
		Heap_ShiftDown(array,len,i);
	}
	//循环尾删
	for (int i = len-1; i > 0; i--)
	{
		Swap(array, 0, len - 1);
		--len;
		Heap_ShiftDown(array, len, 0);
	}
}

//6.快速排序
//霍尔法
int partion(int* array, int begin, int end)
{
	int key = array[begin];
	int start = begin;
	while (begin < end)
	{

		while (key <= array[end] && begin < end)
		{
			end--;
		}
		while (key >= array[begin] && begin < end)
		{
			begin++;
		}
	//交换
		Swap(array, begin, end);
	}
	Swap(array, start, begin);
	return begin;
}
void Quick_Sort(int* array, int begin, int end)
{
	if (begin >= end)
		return;
	int keypos = partion(array, begin, end);
	Quick_Sort(array, begin, keypos-1);
	Quick_Sort(array, keypos + 1, end);

}

//7.归并排序
//合并: 需要知道两个有序子序列的区间: [begin, mid]  [mid + 1, end]

void Merge(int* array, int begin,int mid,int end,int* tmp)
{
	int begin1 = begin, end1 = mid, begin2 = mid + 1, end2 = end;
	int idx = begin;
	//合并
	while (begin1 <= end1 && begin2 <= end2)
	{
		if (array[begin1] <= array[begin2])
		{
			tmp[idx++] = array[begin1++];
		}
		else
			tmp[idx++] = array[begin2++];
	}
	//查看是否还有剩余元素
	if (begin1 <= end1)
		memcpy(tmp + idx, array + begin1, sizeof(int) * (end1 - begin1 + 1));
	if(begin2<=end2)
		memcpy(tmp + idx, array + begin2, sizeof(int) * (end2 - begin2 + 1));

	//拷贝到原始空间
	memcpy(array + begin, tmp + begin, sizeof(int) * (end - begin + 1));
}

void MergeSortR(int* array, int begin, int end, int* tmp)
{
	if (begin >= end)
		return;
	int mid = begin + (end - begin) / 2;
	//首先确保子区间有序
	MergeSortR(array, begin, mid,tmp);
	MergeSortR(array, mid + 1, end, tmp);

	//其次对有序子区间进行排序
	Merge(array, begin, mid,end,tmp);
}

void Merge_Sort(int* array, int n)
{
	int* tmp = (int*)malloc(sizeof(int) * n);
	MergeSortR(array, 0, n - 1, tmp);
	free(tmp);
}

//8.计数排序
void Count_Sort(int* array, int n)
{
	int max = array[0], min = array[0];
	for (int i = 0; i < n; i++)
	{
		if (array[i] > max)
			max = array[i];
		if (array[i] < min)
			min = array[i];
	}
	//确定容量大小
	int range = max - min + 1;
	//开辅助空间进行计数	
	int* CountArr = (int*)malloc(sizeof(int) * range);
	//将数组全部清零
	memset(CountArr, 0, sizeof(int) * range);
	//统计数据次数
	for (int i = 0; i < n; i++)
	{
		CountArr[array[i] - min]++;
	}
	//恢复队列数据
	int idx = 0;

	for (int i = 0; i < range; i++)
	{
		while (CountArr[i]--)
		{
			array[idx++] = i + min;
		}
	}
	free(CountArr);
}


//8.桶排序


int main()
{
	int n = 10;
	int arr[10];
	srand((unsigned int)time(NULL));//产生随机数
	for (int i = 0; i < 10; i++)
	{
		arr[i] = rand() % 20;
	}
	cout << "排序前的数组元素:" << endl;
		Print(arr, 10);
		//Insert_Sort(arr, 10);
		//Shell_Sort(arr,10);
		//Select_Sort(arr, 10);
		//Bubble_Sort(arr, 10);
		//Heap_Sort(arr, 10);
		//Quick_Sort(arr, 0, 9);
		//Merge_Sort(arr,10);
		//Count_Sort(arr, 10);
		
		cout << "排序的后数组元素:" << endl;
		Print(arr, 10);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值