码迷,mamicode.com
首页 > 编程语言 > 详细

各种常见的排序,冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序

时间:2015-08-04 17:15:35      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:各种常见排序   希尔      快速   归并   

各种常见的排序

要开始找工作了,把以前学的各种小知识复习一遍,以下是各种常见的排序的简单实现(冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序),至于原理就不写出来了,代码比较简单,看一下就懂,再不行可以随意找本书或百度!

#include <iostream>
using namespace std;

//	冒泡
void BubbleSort(int data[], int length)
{
	if(data == NULL || length <= 0)
		return ;
	for (int i = length - 1; i > 0; --i)
	{
		int exchange = 1;
		for (int j = i - 1; j >= 0; --j)
		{
			int tmp;
			if (data[i] < data[j])
			{
				tmp = data[i];
				data[i] = data[j];
				data[j] = tmp;
			}
			exchange = 0;
		}
		if(exchange)
			return;
	}
}

//	冒泡排序
void BubbleSort_2(int data[], int length)
{
	for (int i = 0; i < length - 1; ++i)
	{
		int exchange = 0;
		for (int j = length - 1; j > i; --j)
		{
			int tmp;
			if (data[j - 1] > data[j])
			{
				tmp = data[j];
				data[j] = data[j - 1];
				data[j - 1] = tmp;
			}
			exchange = 1;
		}
		if(!exchange)
			return;
	}
}

//	直接插入排序
void InsertSort(int data[], int length)
{
	if(data == NULL || length <= 0)
		return;
	for (int i = 1; i < length; ++i)
	{
		int tmp = data[i];
		int j = i - 1;
		while (j >= 0 && data[j] > tmp)
		{
			data[j + 1] = data[j];
			--j;
		}
		data[j + 1] = tmp;
	}
}

// 直接选择排序
void SelectSort(int data[], int length)
{
	for(int i = 0; i < length - 1; ++i)
	{
		int k = i;
		for(int j = i + 1; j < length; ++j)
		{
			if (data[j] < data[k])
				k = j;
		}
		if (k != i)
		{
			int tmp = data[i];
			data[i] = data[k];
			data[k] = tmp;
		}
	}
}

//	快速排序
void QuickSort(int data[], int start, int last)
{
	if(data == NULL || start > last)
		return;
	int i = start, j = last;
	if(start < last)
	{
		int tmp = data[start];
		while(i != j)
		{
			while (j > i && data[j] > tmp)
				--j;
			data[i] = data[j];
			while(i < j && data[i] < tmp )
				++i;
			data[j] = data[i];
		}
		data[i] = tmp;
		QuickSort(data, start, i - 1);
		QuickSort(data, i + 1, last);
	}
}

//	希尔排序
void ShellSort(int data[], int length)
{
	int gap = length / 2;
	while (gap > 0)
	{
		for(int i = gap; i < length ; ++i)
		{
			int tmp = data[i];
			int j = i - gap;
			while (j >= 0 && tmp < data[j])
			{
				data[j + gap] = data[j];
				j = j - gap;
			}
			data[j + gap] = tmp;
			//j = j - gap;
		}
		gap = gap / 2;
	}
}

void sift(int data[], int low, int high)
{
	// 若第一个元素的下标为0,则两个子节点的下标为:2 * 0 = 0, 2 * 0 + 1 = 1
	//	不对(与父节点重合),这也就还前面说的第一个元素的下标要从1开始的原因。
	int i = low, j = 2 * i;
	int tmp = data[i];
	while (j <= high)
	{
		if(j < high && data[j] < data[j + 1])
			++j;
		if(data[j] > tmp)
		{
			data[i] = data[j];
			i = j;
			j *= 2;
		}
		else
			break;
	}
	data[i] = tmp;
}

//	堆排序
void HeapSort(int data[], int length)
{
	for(int i = length / 2; i > 0; --i)
		sift(data, i, length);
	for (int j = length ; j > 1; --j)
	{
		int tmp = data[1];
		data[1] = data[j];
		data[j] = tmp;
		sift(data, 1, j - 1);
	}
}

//	归并排序

void Merge(int data[], int low, int mid, int high)
{
	//	一次归并
	// 将相邻两个有序表 [low, mid],[mid + 1, high] 合并到一个表中
	if (data == NULL || low < 0 || low > mid || mid > high)
		return;
	int i = low, j = mid + 1;
	//int *data_tmp = (int *)malloc(sizeof(int) * (high - low + 1));
	int *data_tmp = new int[high - low + 1];
	int k = 0;
	while(i <= mid && j <= high)
	{
		if (data[i] <= data[j])
		{
			data_tmp[k] = data[i];
			++i;
			++k;
		}
		else 
		{
			data_tmp[k] = data[j];
			++k;
			++j;
		}
	}
	while (i <= mid)
	{
		data_tmp[k] = data[i];
		++i;
		++k;
	}
	while(j <= high)
	{
		data_tmp[k] = data[j];
		++j;
		++k;
	}
	for (int k = 0, i = low; i <= high; ++i, ++k)
		data[i] = data_tmp[k];
}

void MergePass(int data[], int extent, int length)
{
	//	归并两个长度为extent的有序表
	if(data == NULL || extent <= 0 || extent > length)
		return;
	int i;
	for (i = 0; i + 2 * extent < length; i += 2 * extent)
		Merge(data, i, i + extent - 1, i + 2 * extent - 1);
	// 可能还剩下一些单的没有配对的元素
	if(i + extent - 1 < length)	   //	若最后元素剩下小与一个extent的长度,则没必要归并
		Merge(data, i, i + extent - 1, length - 1);
}

void MergeSort(int data[], int length)
{
	if(data == NULL || length <= 0)
		return;
	for(int extent = 1; extent < length; extent *= 2)
		MergePass(data, extent, length);
}

void main()
{
	int data[] = {0,9,8,7,1,5,6,3,4,2,45,26,789,12,79,7832,4565,413,46,455,78,58};
	//BubbleSort_2(data,22);
	//InsertSort(data,22);
	//InsertSort(data,22);
	//QuickSort(data, 0, 21);
	//ShellSort(data,22);
	//HeapSort(data, 21);   // 第一个元素没有算进去
	MergeSort(data,22);
	for(int i = 0; i < 22; ++i)
		cout << data[i] << " ";
	cout << endl;
}

至于基数排序和桶排序,以前写过所以这里就不重复了,在

http://blog.csdn.net/xwchao2014/article/details/44804087


版权声明:本文为博主原创文章,未经博主允许不得转载。

各种常见的排序,冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序

标签:各种常见排序   希尔      快速   归并   

原文地址:http://blog.csdn.net/xwchao2014/article/details/47278893

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!