面试题之排序

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

//选择排序
void SelectSort(int *array, int size)
{
	for (int idx = 0; idx < size; ++idx)
	{
		int min = idx ;//假定第一个元素最小
		int tmp = idx + 1;//标记第二个元素
		while (tmp < size)//寻找最小的元素
		{
			if (array[tmp] < array[min])
			{
				min = tmp;
			}
			tmp++;
		}
		if (idx != min)
		{
			std::swap(array[min], array[idx]);
		}
	}
}

//冒泡排序
void BubbleSort(int* array, int size)
{
	int flag = 1;
	int  count = 0;
	for (int idx = 0; idx < size - 1; ++idx)//控制数据向后遍历
	{
		for (int jx = 0; jx < size - idx - 1; ++jx)//两个数进行比较
		{
			if (array[jx]>array[jx + 1])
			{
				std::swap(array[jx], array[jx + 1]);
				flag = 0;
			}
			count++;//标记比较次数
		}
		if (flag == 1)//有序的不进行比较
		{
			break;
		}
	}
}

//递归归并排序
void Merge(int *array, int *temp,int left, int mid, int right)//归并
{
	int begin1 = left;//标记最左边的节点
	int end1 = mid;//标记中间的节点
	int begin2 = mid+1;// 
	int end2 = right;
	int index = left;
	while (begin1 <= end1 && begin2 <= end2)
	{
		if (array[begin1] < array[begin2])
		{
			temp[index++] = array[begin1++];
		}
		else
		{
			temp[index++] = array[begin2++];
		}
	}
	while (begin1 <= end1)
	{
		temp[index++] = array[begin1++];
	}
	while (begin2 <= end2)
	{
		temp[index++] = array[begin2++];
	}
}
void _MergeSort(int *array,int *temp, int left, int right)
{
	if (left < right)
	{
		int mid = left + ((right - left) >> 1);
		_MergeSort(array, temp, left, mid);
		_MergeSort(array,temp, mid + 1, right);
		Merge(array, temp,left, mid, right);
		memcpy(array + left, temp + left, sizeof(array[0])*(right - left + 1));
	}
}
void MergeSort(int *array, int size)
{
	int *temp = new int [size];
	if (NULL != temp)
	{
		_MergeSort(array, temp, 0, size - 1);
		delete[]temp;
	}
}

//非递归归并排序
void MergeSortNor(int *array, int size)
{
	int* temp = new int[size];
	int left = 0;
	int right = size - 1;
	int gap = 1;
	while (gap < size)
	{
		for (size_t idx = 0; idx < size; idx += 2 * gap)
		{
			left = idx;
			int mid = idx + gap - 1;
			right = mid + gap;
			if (mid >= size)
			{
				mid  = size - 1;
			}
			if (right >= size)
			{
				right = size - 1;
			}
			Merge(array, temp, left, mid, right);//归并
		}
		memcpy(array, temp, size*sizeof(int));
		gap++;
	}
	delete[]temp;
}

//打印排序后的序列
void printfSort(int arr[], int count)
{
	for (int idx = 0; idx < count; ++idx)
	{
		cout << arr[idx] << " ";
	}
	cout << endl;
}
void FuntTest()
{
	//int array[] = { 1 };
	int array[] = { 21, 25, 49, 25, 0, 16 };
	//int array[] = { 7, 3, 2, 0, 1, 4 };
	//int array[] = { 2, 3, 5, 7, 9, 0, 1, 6, 4, 8 };
	int count = sizeof(array) / sizeof(array[0]);
	cout << count << endl;
	printfSort(array, count);
	//BubbleSort(array, count);//ok
	//SelectSort(array, count);//ok
	//InsertSort(array, count);
	//MergeSort(array, count);//递归归并排序
	//MergeSortNor(array, count);非递归归并排序
	printfSort(array,count);
}
int main()
{
	FuntTest();
	system("pause");
	return 0;
}

归并排序的具体实现思路



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值