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; }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- UEFI启动模式下的windows10双系统(+ubuntu18.4)安装实用教程
- GUI(Graphical User Interface)
- QuickPart功能改进_Sharepoint_MOSS
- QuickPart Permission问题
- 结对编程-带UI的小初高数学学习软件
- Go之URL Query String 编码器和解码器
- HashMap相同key累加value的问题
- Servlet&HTTP&Request
- 建造者模式(Builder Pattern)——C#设计模式五
- APUE
- Guideline 2.5.4 - Performance - Software Requirements
- jbuilder2005 to jbuilder2006
- JBuilder连接SQL 数据库方法
- requestAnimationFrame
- 报错:Expected MultipartHttpServletRequest: is a MultipartResolver configured?
- ESP32 Arduino环境搭建
- C# 中 StringBuilder和String的区别
- WP Survey And Quiz Tool
- arduino四轮小车程序前篇
- arduino四轮小车程序后篇