Divide and Conquer

Divide and Conquer

在这里插入图片描述
一、Quick Sort
二、Merge Sort
三、Counting Inversions
在这里插入图片描述

// Divide-and-Conquer.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;
/*******快速排序**********/

//======================
//第一种线性划分
/***** avoid swap(i,j),the only losing record is temp when assign *****/
int Partition(int r[], int i, int j)
{
	int temp = r[i];  //the fist element as privot
	while (i < j)
	{
		while (i < j&&r[j] >= temp)
			j--;   //找到从右边开始第一个比pivot小的数
		if (i < j)
			r[i++] = r[j];
		while (i < j&&r[i] < temp)
			i++;  //找到从左边开始第一个不小于pivot的数
		if (i < j)
			r[j--] = r[i];
	}
	r[i] = temp;
	return i;
}
//第二种线性划分
/**** liner ***/
int partition1(int r[], int i,int j) 
{
	int temp = r[j];  //把最后一个数作为基准pivot
	int tmp = 0;
	for (int x = i; x < j; ++x)
	{
		if (r[x] < temp)
		{
		    tmp = r[x];
			r[x] = r[i];
			r[i++] = tmp;  
		}
	}
	r[j] = r[i];
	r[i] = temp;   //i为从左往右第一个大于等于pivot的下标,返回pivot所在位置
	return i;
}
void QuickSort(int r[], int i, int j)
{
	if (i < j)
	{
		int pivot = Partition(r, i, j);
		QuickSort(r, i, pivot - 1);
		QuickSort(r, pivot + 1, j);
	}
}

//归并排序

/*** combine ***/
/**** c++ sequential compilation ***/
void merge(int data[], int first, int mid, int last) {
	int *temp = new int[last + 1];  /*initialize array without known length */
	int first1 = first, last1 = mid;
	int first2 = mid + 1, last2 = last;
	int index = first1;
	while (first1 <= last1&&first2 <= last2) {  //将两个有序序列归并放到temp数组中
		if (data[first1]<data[first2])
			temp[index++] = data[first1++];
		else
			temp[index++] = data[first2++];
	}
	//如果两个归并序列中有一个序列还没有遍历完,就把该序列剩下的数添加到temp中
	while (first1 <= last1)
		temp[index++] = data[first1++];
	while (first2 <= last2)
		temp[index++] = data[first2++];
	for (index = first; index <= last; index++) /*assign temp[] to data[]*/
		data[index] = temp[index];
}
void mergeSort(int data[], int min, int max) {  //递归分解自身,直至该列表被分为长度为1
	if (min<max) {
		int mid = (min + max) / 2;
		mergeSort(data, min, mid);
		mergeSort(data, mid + 1, max);
		merge(data, min, mid, max);
	}
}

//求解逆序对
int cou = 0;
void Merge_co(int r[], int r1[], int s, int m, int t)
{
	int i = s;
	int j = m + 1;
	int k = s;
	while (i <= m&&j <= t)
		if (r[i - 1] <= r[j - 1]) //左数组比右数组小
		{
			r1[k - 1] = r[i - 1];
			k++; i++;
		}
		else       //计数逆序数
		{
			cou += m - i + 1;
			r1[k - 1] = r[j - 1];
			k++; j++;
		}
	if (i <= m)
		while (i <= m)
		{
			r1[k - 1] = r[i - 1];
			k++; i++;
		}
	else
		while (j <= t)
		{
			r1[k - 1] = r[j - 1];
			k++; j++;
		}
}

void MergePass1(int r[], int r1[], int n, int h)
{
	int i = 1;
	while (i <= n - 2 * h + 1)
	{
		Merge_co(r, r1, i, i + h - 1, i + 2 * h - 1);
		i += 2 * h;
	}
	if (i < n - h + 1)
		Merge_co(r, r1, i, i + h - 1, n);
	else
		for (int k = i; k <= n; k++)
			r1[k - 1] = r[k - 1];
}
void MergeSort1(int r[], int n)
{
	int h = 1;
	int *r1 = new int[n];
	while (h < n)
	{
		MergePass1(r, r1, n, h);
		h = 2 * h;
		MergePass1(r1, r, n, h);
		h = 2 * h;
	}
}
int main()
{
	/**
	int a[] = { 3,7,2,5,10,11,8,6,13 };
	//快速排序
	QuickSort(a, 0, 8);
	for (int i = 0; i < 9; ++i)
		cout << a[i] << " ";
	cout << endl;
	*/
	//归并排序
	int b[] = { 3,7,2,5,10,11,8,6,13 };
	mergeSort(b,0,8);
	for (int i = 0; i < 9; ++i)
		cout << b[i] << " ";
	cout << endl;
	/**
	//逆序数
	int c[] = { 3,7,2,5,10,11,8,6,13 };
	MergeSort1(c, 8);
	cout << cou << endl;
	*/
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值