Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- using namespace std;
- struct node
- {
- int x;
- node* next;
- };
- void Print(node* r){
- while (r != NULL){
- cout << r->x << ", ";
- r = r->next;
- }cout << endl;
- }
- void Swap(node* a, node* b){
- int t = a->x;
- a->x = b->x;
- b->x = t;
- }
- node* Sort(node* r, int n){ //return the first node
- if (n == 1)
- return r;
- else if (n == 2){
- if (r->x > r->next->x)
- Swap(r, r->next);
- return r;
- }
- bool s1 = true, s2 = true;
- int i = 0;
- node *tr = r, *f, *p;
- while (i<(n-1)/2){
- if (tr->x > tr->next->x)
- s1 = false;
- tr = tr->next;
- i++;
- }
- tr = tr->next;
- i++;
- int ti = i;
- node* r2 = tr;
- while (ti<n-1){
- if (tr->x > tr->next->x){
- s2 = false;
- break;
- }
- tr = tr->next;
- ti++;
- }
- if (!s1)
- r=Sort(r, i);
- if (!s2)
- r2=Sort(r2, n - i);
- node* first = r;
- f = r;
- int ki = 0;
- tr = r;
- while (ki<(n - 1) / 2){
- tr = tr->next;
- ki++;
- }
- p = tr;
- ti = i;
- int k = 0;
- while (i < n && k<ti){
- if (r->x > r2->x){
- p->next = r2->next;
- r2->next = r;
- if (f != r){
- f->next = r2;
- f = f->next;
- }
- else{
- first = r2;
- f = r2;
- }
- r2 = p->next;
- i++;
- }
- else{
- if (r != f)
- f = f->next;
- r = r->next;
- k++;
- }
- }
- return first;
- }
- int main(){
- node* r = new node;
- node* tr = r;
- node* pr = r;
- int n = 10,i=0;
- while (i < n){
- tr->x = rand()%100000;
- tr->next = new node;
- pr = tr;
- tr = tr->next;
- i++;
- }
- delete tr;
- pr->next = NULL;
- Print(r);
- cout << "start\n";
- r = Sort(r, n);
- cout << "end\n";
- Print(r);
- while (r != NULL){
- node* tmp = r;
- r = r->next;
- delete tmp;
- }
- getchar();
- return 0;
- }
Add Comment
Please, Sign In to add comment