//拓扑排序
#include <cstdlib>
#include <iostream>
#include <stack>
using namespace std;
stack<int>mystack;
struct node
{
int adjvex;
node *next;
};
int indegree[9999];
int create(node adj[], int n, int m)
{
node *p;
for(int i = 0; i< n; i++)
{
adj[i].adjvex = i;
adj[i].next = NULL;
}
for(int i = 0; i< m; i++)
{
int u,v;
cin>> u >>v;
p = newnode;
p->adjvex = v;
p->next = adj[u].next;
adj[u].next = p;
}
return 1;
}
void print(node adj[], int n)
{
inti;
node*p;
for(int i = 0; i < n; i++)
{
p = adj[i].next;
while(p != NULL)
{
cout<< p->adjvex<< " ";
p =p->next;
}
cout << endl;
}
}
void topsort(node adj[], int n)
{
node*p;
memset(indegree, 0, sizeof(indegree));
for(int i = 0; i < n; i++)
{
p = adj[i].next;
while(p != NULL)
{
indegree[p->adjvex]++;
p =p->next;
}
}
for(int i = 0; i < n; i++)
{
if(indegree[i] == 0)
mystack.push(i);
}
intcount = 0;
while(mystack.size() != 0)
{
int i = mystack.top();
mystack.pop();
cout << i<< " ";
count++;
for(p = adj[i].next; p != NULL; p =p->next)
{
int k = p->adjvex;
indegree[k]--;
if(indegree[k] == 0)
mystack.push(k);
}
}
cout<< endl;
if(count < n)
cout << "有回路"<< endl;
}
int main(int argc, char *argv[])
{
int n;
int m;
cin>> n >>m;
node adj[9999];
create(adj, n, m);
cout<< endl;
print(adj, n);
cout<< endl;
topsort(adj, n);
system("PAUSE");
returnEXIT_SUCCESS;
}
//快速排序
#include <cstdlib>
#include <iostream>
using namespace std;
int partition(int a[], int low, int high)
{
int p = low;
int i = low-1;
int end = high;
int temp;
for(int j = p; j< end; j++)
{
if(a[j]<= a[end])
{
i++;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
temp = a[i+1];
a[i+1] = a[end];
a[end] = temp;
return i+1;
}
void quicksort(int a[], int low, int high)
{
intmark;
if(low< high)
{
mark =partition(a, low, high);
quicksort(a, low, mark-1);
quicksort(a, mark+1, high);
}
}
int main(int argc, char *argv[])
{
int a[8] ={49,38,65,97,76,13,27,49};
quicksort(a, 0,7);
for(int i = 0; i< 8; i++)
cout << a[i]<< " ";
system("PAUSE");
returnEXIT_SUCCESS;
}
//冒泡排序
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int a[8] ={49,38,65,97,76,13,27,49};
int n = 8;
int temp;
for(int i = 1; i< n; i++)
for(int j= 0; j < n-i; j++)
{
if(a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
for(int i = 0; i< 8; i++)
cout << a[i]<< " ";
system("PAUSE");
returnEXIT_SUCCESS;
}
//堆排序
#include <cstdlib>
#include <iostream>
using namespace std;
void Maxheapify(int A[], int i, int len)
{
int l= 2*i+1, r = 2*i+2;
intlargest;
inttemp;
if(l<= len && A[l]> A[i])
largest = l;
else
largest = i;
if(r<= len && A[r]> A[largest])
largest = r;
if(largest != i)
{
temp = A[largest];
A[largest] = A[i];
A[i] = temp;
Maxheapify(A, largest, len);
}
}
int main()
{
int A[100] = {49, 38,65, 97, 76, 13, 27};
int B[100];
int n = 6;
for(int i = (n-1)/2; i>= 0; i--)
Maxheapify(A, i, n);
for(int i = 0; i<= 6; i++)
cout<< A[i]<< " ";
cout<< endl;
for(int i = 0; i<= 6; i++)
{
B[i] =A[0];
A[0] =A[n];
n--;
Maxheapify(A, 0, n);
}
for(int i = 0; i<= 6; i++)
cout<< B[i]<< " ";
system("pause");
return 0;
}
//二分查找(迭代)
#include <cstdlib>
#include <iostream>
using namespace std;
int search(int a[], int low, int high, int find)
{
bool mark = true;
while(low <= high)
{
int mid =(low+high)/2;
if(find ==a[mid])
return mid;
if(find< a[mid])
high = mid-1;
else
low = mid+1;
}
mark = false;
return mark;
}
int main(int argc, char *argv[])
{
int a[100] ={2,4,9,20,40,99,200};
int find = 41;
int low = 0;
int high = 6;
if(search(a, low, high,find))
cout<< search(a, low, high, find)<< endl;
else
cout<< "Can't find"<< endl;
system("PAUSE");
returnEXIT_SUCCESS;
}