Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1003581
  • 博文数量: 150
  • 博客积分: 3017
  • 博客等级: 少校
  • 技术积分: 3829
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 14:40
个人简介

Now in Baidu WISE team

文章分类

全部博文(150)

文章存档

2014年(8)

2013年(31)

2012年(111)

分类: C/C++

2013-01-10 12:24:43

一个单链表无序数组,要求O(1)空间复杂度 O(nlogn)时间复杂度排序。
明显快排,但链表没写过,练手。
代码已验证,可运行,主体没有问题 ,但细节有一个小问题。手工开辟了个空的头结点,实际没有删除。这点需要改进。
 

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct tagNode{
  4.     int value;
  5.     struct tagNode* next;
  6. }Node;

  7. void outputLinkedList(Node * head){
  8.     while(head!=NULL){
  9.         printf("-->%d ",head->value);
  10.         head = head->next;
  11.     }
  12.     printf("\n");
  13. }

  14. Node * createNode(int value){
  15.     Node * ret = (Node*)malloc(sizeof(Node));
  16.     ret->value = value;
  17.     ret->next = NULL;
  18.     return ret;
  19. }
  20. Node * createLinkedList(int *input, int size){
  21.     Node* ret = NULL;
  22.     int i = 0;
  23.     Node *tmp = NULL;
  24.     for(;i<size;i++){
  25.         ret = createNode(input[i]);
  26.         ret->next = tmp;
  27.         tmp = ret;
  28.     }
  29.     return ret;
  30. }

  31. void swapvalue(Node * left, Node* right){
  32.     if(left == NULL || right == NULL || left == right)
  33.         return;

  34.     (left->value)^=(right->value);
  35.     (right->value)^=(left->value);
  36.     (left->value)^=(right->value);
  37. }
  38. Node *partition(Node* start, Node* end){
  39.     if(end == NULL) return start;
  40.     if(start == NULL) return NULL;
  41.     
  42.     Node* low = (Node*)malloc(sizeof(Node));
  43.     low->next = start;
  44.     low->value = 10000;
  45.     Node* high = start;
  46.     int piv = end->value;
  47.         printf("piv = %d \n", piv);
  48.     while(high!=end){
  49.         if(high->value<piv){
  50.             low = low->next;
  51.                         printf("swap %d %d\n",low->value, high->value);
  52.             swapvalue(low,high);
  53.         }
  54.         high = high->next;
  55.     }
  56.     Node* ret = low;
  57.     low = low->next;
  58.     swapvalue(low,end);
  59.     return ret;
  60. }

  61. void llqsort(Node* start, Node* end){
  62.     if(start == NULL || end == NULL ||start == end || end->next == start) return ;
  63.     Node* mid = partition(start, end);
  64.     llqsort(start,mid);
  65.     mid = mid->next;
  66.     if(mid!=NULL)
  67.         llqsort(mid->next, end);
  68. }

  69. Node* gettail(Node*head){
  70.     if(head == NULL) return NULL;
  71.     while(head->next!=NULL)
  72.         head = head->next;
  73.     return head;
  74. }


  75. int main(){
  76.     int input[] = {1,3,5,2,6,4,2};
  77.     Node* head = createLinkedList(input, sizeof(input)/sizeof(int));
  78.     Node* tail = gettail(head);
  79.     outputLinkedList(head);
  80.         printf("tail = %d\n",tail->value);
  81.     llqsort(head, tail);
  82.     outputLinkedList(head);
  83. }

阅读(3340) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~