递归求全排列
其实它是没有排序的全排列……
-
#include<iostream>
-
using namespace std;
-
-
#define N 30
-
-
/********************************
-
* 打印数组函数
-
********************************/
-
void printArray(int A[], int n){
-
for(int i=0; i<n; i++){
-
cout<<A[i]<<" ";
-
}
-
cout<<endl;
-
}
-
-
/********************************************
-
* 全排列算法
-
*
-
* 输入:数组A[],数组的元素个数n,
-
* 当前递归层次已完成排列的元素个数k(0<=k<n)
-
* 输出:数组A[]的全排列
-
********************************************/
-
void perm(int A[], int n, int k){
-
if(k==n-1){ // 已完成排列则打印
-
printArray(A,n);
-
}else{
-
for(int i=k; i<n ;i++){ // 生成后续的一系列排列
-
swap(A[i], A[k]);
-
perm(A, n, k+1);
-
swap(A[i], A[k]);
-
}
-
}
-
}
-
-
int main(){
-
int A[N], n;
-
-
cout<<"请输入数组的元素个数:";
-
cin>>n;
-
-
cout<<"请输入数组的元素:";
-
for(int i=0; i<n; i++){
-
cin>>A[i];
-
}
-
-
cout<<"数组的全排列是:"<<endl;
-
perm(A,n,0);
-
-
return 0;
-
}
合并排序实现
= =
-
#include<iostream>
-
using namespace std;
-
-
/******************************************
-
* 合并两个有序的子数组
-
*
-
* 输入:整数数组A[],下标p,q,r,元素个数m
-
* 其中A[p]~A[q]和A[q+1]~A[r]已按递增顺序排序
-
* 输出:按递增顺序排序的子数组A[p]~A[r]
-
******************************************/
-
void merge(int A[], int p, int q, int r, int m){
-
int *bp = new int[m];
-
int i,j,k;
-
i = p; j = q+1; k=0;
-
while(i<=q&&j<=r){ // i从p开始,j从q+1开始 比较A[i]和A[j],递减放入新数组
-
if(A[i]<=A[j]){
-
bp[k++] = A[i++];
-
}else{
-
bp[k++] = A[j++];
-
}
-
}
-
if(i==q+1){ // 若A[p]~A[q]已经输入完,则将A[q+1]~A[r]中未录入的继续录入
-
for(;j<=r;j++){
-
bp[k++] = A[j];
-
}
-
}else{ // 若A[q+1]~A[r]已经输入完,则A[p]~A[q]将中未录入的继续录入
-
for(;i<=q;i++){
-
bp[k++] = A[i];
-
}
-
}
-
k = 0;
-
for(i=p; i<=r; i++){ // 把排序好的数存回A
-
A[i] = bp[k++];
-
}
-
delete bp;
-
}
-
-
/******************************************
-
* 合并排序算法
-
*
-
* 输入:具有n个元素的数组A[]
-
* 输出:按递增顺序排序的数组A[]
-
******************************************/
-
void merge_sort(int A[], int n){
-
int i,s,t = 1;
-
while(t<n){ // 每2个含t/2个元素的数组进行合并,合并完后t*2
-
s = t, t = 2*s, i = 0;
-
while(i+t<n){
-
merge(A,i,i+s-1,i+t-1,t);
-
i = i + t;
-
}
-
if(i+s<n){
-
merge(A,i,i+s-1,n-1,n-i);
-
}
-
}
-
}
-
-
int main(){
-
int i,n;
-
-
cout<<"请输入数组元素个数:";
-
cin>>n;
-
-
cout<<"请输入元素:"<<endl;
-
int* A = new int[n];
-
for(i=0;i<n;i++){
-
cin>>A[i];
-
}
-
-
merge_sort(A,n);
-
-
cout<<"排序结果:"<<endl<<A[0];
-
for(i=1;i<n;i++){
-
cout<<" "<<A[i];
-
}
-
cout<<endl;
-
-
return 0;
-
}
C的RSA密码算法实现
C写的,囧,网络课本上看过,对于我这种数学白痴怎么可能会?拖住wekooo要了公式,随便写写……
求主元素的线性算法
知道怎么算,实现起来好囧,百度了一下,发现这个好简洁 = =,不过这个输入时就一定有主元素,故没有再对函数找出来的A[x]作判定:
基数排序实现
rt……
求亲密数对
= =
离散集合的find与union操作
@ _ @
-
#include<iostream>
-
using namespace std;
-
-
#define Type int
-
#define N 100
-
-
typedef struct Tree_node {
-
struct Tree_node* parent;
-
int rank;
-
Type value;
-
}NODE;
-
-
NODE* find(NODE *xp){
-
NODE *wp, *yp = xp, *zp = xp;
-
while(yp->parent){
-
yp = yp->parent;
-
}
-
while(zp->parent){
-
wp = zp->parent;
-
zp->parent = yp;
-
zp = wp;
-
}
-
return yp;
-
}
-
-
NODE* unionTree(NODE *xp, NODE *yp){
-
NODE *up, *vp;
-
up = find(xp);
-
vp = find(yp);
-
if(up->rank<=vp->rank){
-
up->parent = vp;
-
if(up->rank == vp->rank){
-
vp->rank ++;
-
}
-
up = vp;
-
}else{
-
vp->parent = up;
-
}
-
return up;
-
}
-
-
NODE* createNode(Type value, NODE* parent = NULL){
-
NODE* p = new NODE;
-
if(parent){
-
p->rank = parent->rank + 1;
-
}else{
-
p->rank = 1;
-
}
-
p->parent = parent;
-
p->value = value;
-
return p;
-
}
-
-
int main(){
-
NODE* A[N];
-
-
/* 建立集合{1,2,3,4} */
-
A[4] = createNode(4);
-
A[3] = createNode(3,A[4]);
-
A[2] = createNode(2,A[4]);
-
A[1] = createNode(1,A[2]);
-
-
-
-
/* 建立集合{5,6,7,8} */
-
A[8] = createNode(8);
-
A[7] = createNode(7,A[8]);
-
A[6] = createNode(6,A[8]);
-
A[5] = createNode(5,A[6]);
-
-
/* 合并两集合 */
-
unionTree(A[1],A[5]);
-
-
/* 遍历集合 */
-
for(int i = 1; i<=8; i++){
-
cout<<"结点"<<(A[i]->value)<<" ";
-
if(A[i]->parent)cout<<"父结点"<<(A[i]->parent->value);
-
else cout<<"该结点为根结点";
-
cout<<endl;
-
}
-
-
return 0;
-
}
合并堆算法
编写一个算法,把两个相同大小的堆合并成一个堆。
-
/*
-
* Title: 编写一个算法,把两个相同大小的堆,合并成一个堆。
-
* Author: YOYO
-
* Time: 2009-3-8
-
*
-
* 合并算法即其中的merge_heaps(Type A[], Type B[], Type C[], int n)
-
* 该算法将两个相同大小的堆A和B合并为一个大顶堆,并存储到C中。时间复杂度为O(n*log(n))
-
*
-
*/
-
#include<iostream>
-
using namespace std;
-
-
#define Type int
-
#define N 100
-
-
void shift_up(Type H[], int i);
-
void shift_down(Type H[], int n, int i);
-
void insert(Type H[], int &n, Type x);
-
void del(Type H[], int &n, int i);
-
Type delete_max(Type H[], int &n);
-
void print_heap(Type H[], int n);
-
void make_heap(Type H[], int n);
-
void heap_sort(Type H[], int n);
-
void merge_heaps(Type A[], Type B[], int n);
-
-
void shift_up(Type H[], int i){
-
bool done = false;
-
while(i!=1){
-
if(H[i]<=H[i/2]){
-
break;
-
}
-
swap(H[i], H[i/2]);
-
i /= 2;
-
}
-
}
-
-
void shift_down(Type H[], int n, int i){
-
bool done = false;
-
while( (i=2*i)<=n ){
-
if(i+1<=n&&H[i+1]>H[i]){
-
i ++;
-
}
-
if(H[i/2]>=H[i]){
-
break;
-
}
-
swap(H[i/2], H[i]);
-
}
-
}
-
-
void insert(Type H[], int &n, Type x){
-
n++;
-
H[n] = x;
-
shift_up(H,n);
-
}
-
-
void del(Type H[], int &n, int i){
-
Type x, y;
-
x = H[i], y = H[n];
-
n--;
-
if(i<=n){
-
H[i] = y;
-
if(y>=x){
-
shift_up(H,i);
-
}else{
-
shift_down(H,n,i);
-
}
-
}
-
}
-
-
Type delete_max(Type H[], int &n){
-
Type x = H[1];
-
del(H, n, 1);
-
return x;
-
}
-
-
void heap_sort(Type H[], int n){
-
make_heap(H,n);
-
for( int i = n; i>1; i--){
-
swap(H[1],H[i]);
-
shift_down(H,i-1,1);
-
}
-
}
-
-
void print_heap(Type H[], int n){
-
for( int i = 1, j = 1; i<=n; i++){
-
printf("%-4d",H[i]);
-
if((i+1)%j==0){
-
cout<<endl;
-
j*=2;
-
}
-
}
-
cout<<endl;
-
if(i%j)cout<<endl;
-
}
-
-
void make_heap(Type H[], int n){
-
H[n] = H[0];
-
for( int i= n/2; i>=1; i--){
-
shift_down(H,n,i);
-
}
-
}
-
-
/*
-
* 合并堆算法
-
*
-
* 输入:堆A,堆B,堆的长度n
-
* 输出:由堆A和堆B合并成的新大顶堆C
-
*
-
* 该算法执行了2n次时间复杂度为O(log(n))的insert操作,故
-
* 它的执行时间为O(n*log(n))
-
*
-
*/
-
void merge_heaps(Type A[], Type B[], Type C[], int n){
-
int i,k;
-
for(i=1, k = 0; i<=n; i++){
-
insert(C, k, A[i]);
-
}
-
for(i=1, k = n; i<=n; i++){
-
insert(C, k, B[i]);
-
}
-
}
-
-
int main(){
-
int i,n;
-
Type A[N],B[N],C[2*N];
-
-
/* 输入堆的元素 */
-
cout<<"请输入堆的元素个数:";
-
cin>>n;
-
-
cout<<"请输入堆A的元素:";
-
for(i = 0; i<n; i++){
-
cin>>A[i];
-
}
-
-
cout<<"请输入堆B的元素:";
-
for(i = 0; i<n; i++){
-
cin>>B[i];
-
}
-
-
/* 建堆 */
-
make_heap(A,n);
-
make_heap(B,n);
-
-
/* 打印堆*/
-
cout<<"大顶堆A:"<<endl;
-
print_heap(A,n);
-
-
cout<<"大顶堆B:"<<endl;
-
print_heap(B,n);
-
-
/* 合并堆 */
-
merge_heaps(A,B,C,n);
-
-
/* 打印堆*/
-
cout<<"合并后的大顶堆C:"<<endl;
-
print_heap(C,2*n);
-
-
return 0;
-
}