您的位置:首页 > 产品设计 > UI/UE

Divide and Conquer

2020-02-16 22:11 423 查看

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
;
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;
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
Alanre_7 发布了4 篇原创文章 · 获赞 0 · 访问量 182 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: