https://www.ketangpai.com/#/main/classDetail?courseid=MDAwMDAwMDAwMLOGtZmGudFshrVyoQ&courserole=0&submodulename=CourseContent
1 概述
一、思想
二、求解过程
2 求解排序问题
一、快速排序
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int partition(int a[], int s, int e)
{
int i = s, j = e;
int temp = a[s]; //用序列的第1个记录作为基准
while (i != j) //从序列两端交替向中间扫描,直至i=j为止
{
while (i < j && a[j] >= temp)
j--; //从右向左扫描,找第1个关键字小于tmp的a[j]
a[i] = a[j]; //将a[j]前移到a[i]的位置
while (i < j && a[i] <= temp)
i++; //从左向右扫描,找第1个关键字大于tmp的a[i]
a[j] = a[i]; //将a[i]后移到a[j]的位置
}
a[i] = temp;
return i;
}
void f(int a[], int s, int e)
{
if (s < e) //序列内至少存在2个元素的情况
{
int i = partition(a, s, e);
f(a, s, i - 1);
f(a, i + 1, e);
}
}
int main()
{
int a[8] = { 8,8,6,5,4,5,2,1 };
f(a, 0, 7);
for (int i = 0; i < 8; i++)
cout << a[i] << " ";
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int partition(int a[], int low, int high)
{
int i = low, j = high;
int povit = a[low];
while (i < j)
{
while (i < j && a[j] >= povit)
j--;
a[i] = a[j];
while (i < j && a[i] <= povit)
i++;
a[j] = a[i];
}
a[i] = povit;
return i;
}
int solution(int a[], int n)
{
int low = 0; int high = n - 1;
bool f = true;
while (f)
{
int i = partition(a, low, high);
if (i == n / 2 - 1)
f = false;
else if (n / 2 - 1 > i)
low = i + 1;
else
high = i - 1;
}
int s1 = 0, s2 = 0;
for (int i = 0; i < n / 2 ; i++)
{
s1 += a[i];
cout << a[i] << " ";
}
cout << endl;
for (int i = n / 2; i < n; i++)
{
s2 += a[i];
cout << a[i] << " ";
}
int s = s1 - s2;
if (s < 0)
{
s = -s;
}
return s;
}
int main()
{
int a[100], n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
int s = solution(a, n);
cout << s << endl;
}
时间复杂度O(n)
PPt18.。
二、归并排序
三、逆序数
https://www.cnblogs.com/youxin/p/3352940.html
3 求解查找问题
一、查找最大和次大元素
ppt39
二、折半查找
有序序列
int BinSearch(int a[], int low, int high, int k)
{
int mid;
if (low <= high)
{
mid = (low + high) / 2;
if (a[mid] == k)
return mid;
else if (a[mid] > k)
return BinSearch(a, low, mid - 1, k);
else
return BinSearch(a, mid + 1, high, k);
}
else
return -1; //若当前查找区间没有元素时返回-1
}
三、寻找一个序列中第k小元素
int QuickSelect(int a[], int s, int t, int k)
{
int i = s, j = t; tmp;
if (s < t)
{
tmp = a[s];
while (i != j) {
while (j > i && a[j] >= tmp) j--;//从区间两端交替向中间扫描,直至i=j为止
a[i] = a[j];//将a[j]前移到a[i]的位置
while (i < j && a[i] <= tmp) i++;
a[j] = a[i];//将a[i]后移到a[j]的位置
}
a[i] = tmp;
if (k - 1 == i) return a[i];
else if (k - i < i) return QuickSelect(a, s, i - 1, k);//在左区间中递归查找
else return QuickSelect(a, i + 1, t, k); //在右区间中递归查找
}
else if (s == t && s == k - 1)//区间内只有一个元素且为a[k-1]
return a[k - 1];
}
四、寻找两个等长的有序序列的中位数
ppt52
4 求解组合问题
一、求解最大连续子序列和问题
60
二、求解棋盘覆盖问题
68
三、求解循环日程安排问题
78
5 求解大整数乘法和矩阵乘法问题
84
6 并行计算介绍
一、概述
二、模型