首页 > 试题广场 >

单链表的选择排序

[编程题]单链表的选择排序
  • 热度指数:2088 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个无序单链表,实现单链表的选择排序(按升序排序)。

输入描述:
第一行一个整数 n,表示单链表的节点数量。
第二行 n 个整数 val 表示单链表的各个节点。


输出描述:
在给出的函数内返回给定链表的头指针。
示例1

输入

5
1 3 2 4 5

输出

1 2 3 4 5

备注:


#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;

typedef struct ListNode {
  ElemType val;
  struct ListNode* next;
} ListNode, *PListNode, *List;

// function declaration
void printList(List L);
// 简单选择排序算法。复杂的选择排序又称堆排序!!!
List simple_selection_sort_algorithm(List L, const int size);

int main(const int argc, const char* argv[]) {
  int n, val;
  fscanf(stdin, "%d", &n);
  
  PListNode head = NULL, tail = NULL, p;
  while (fscanf(stdin, "%d", &val) != EOF) {
    p = (PListNode) malloc(sizeof(ListNode));
    p->val = val;
    p->next = NULL;
    if (!tail) head = tail = p;
    else tail = tail->next = p;
  }
  
  head = simple_selection_sort_algorithm(head, n);
  return printList(head), 0;
}

void printList(List L) {
  PListNode p = L;
  while (p) {
    fprintf(stdout, "%d", p->val);
    if (p->next) fputc(32, stdout);
    p = p->next;
  }
}

List simple_selection_sort_algorithm(List L, const int size) {
  // corner case
  if (size < 2) return L;
  
  PListNode nodes[size], p = L;
  int i, t;
  for (i = 0; i < size; ++i, p = p->next)
    *(nodes + i) = p;
  
  int min;
  PListNode tmp;
  for (t = 0; t < size - 1; ++t) {
    min = t;
    for (i = t + 1; i < size; ++i)
      if ((*(*(nodes + i))).val < (*(*(nodes + min))).val)
        min = i;
    tmp = *(nodes + t);
    *(nodes + t) = *(nodes + min);
    *(nodes + min) = tmp;
  }
  
  for (i = 0; i < size - 1; ++i)
    (*(nodes + i))->next = *(nodes + i + 1);
  (*(nodes + size - 1))->next = NULL;
  
  return *nodes;
}

发表于 2021-07-25 12:02:50 回复(0)