设待排序的记录序列用单链表作存储结构,编写直接插入排序或简单选择排序的程序。
Java
package com.programmercarl.linkedlist.homework;
import lombok.AllArgsConstructor;
import lombok.Builder;
/**
* @ClassName ListNode
* @Descriotion 单链表的结点
* @Author nitaotao
* @Date 2022/5/2 17:24
* @Version 1.0
**/
@AllArgsConstructor
@Builder
public class ListNode {
/**
* 结点的值
*/
public Integer val;
/**
* 下一个结点
*/
public ListNode next;
/**
* 无参构造
*/
public ListNode() {
}
/**
* 带参构造 1
*/
public ListNode(int val) {
this.val = val;
}
/**
* 带参构造 2
*/
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
@Override
public String toString() {
ListNode cur = this;
while (cur.next != null&&cur.next!=this) {
System.out.print(cur.val+" ");
cur=cur.next;
}
System.out.println(cur.val);
return null;
}
}
package com.programmercarl.linkedlist.homework;
/**
* @ClassName ListAsc
* @Descriotion TODO
* @Author nitaotao
* @Date 2022/5/5 17:23
* @Version 1.0
**/
public class ListAsc {
public static void main(String[] args) {
ListNode node5 = ListNode.builder().val(5).next(null).build();
ListNode node4 = ListNode.builder().val(2).next(node5).build();
ListNode node3 = ListNode.builder().val(16).next(node4).build();
ListNode node2 = ListNode.builder().val(8).next(node3).build();
ListNode node1 = ListNode.builder().val(1).next(node2).build();
order(node1);
System.out.println(node1);
}
/**
* 简单选择排序
*
* @param node
*/
public static void order(ListNode node) {
//已排好序的最大结点
ListNode orderMaxNode = node;
//当前正在比较的阶段
ListNode curNode;
int temp;
while (orderMaxNode != null) {
//如果右边无序部分还有元素
curNode = orderMaxNode.next;
while (curNode != null) {
//每次把右边无序部分的最小值选择出来
if (curNode.val < orderMaxNode.val) {
temp = curNode.val;
curNode.val = orderMaxNode.val;
orderMaxNode.val = temp;
} else {
curNode = curNode.next;
}
}
//逐渐后移,最小值逐渐变大
orderMaxNode = orderMaxNode.next;
}
}
}
C
//
// Created by nitaotao on 2022/5/8->
//
#include <malloc.h>
#include <stdio.h>
//定义结点
typedef struct ListNode {
int val;
struct ListNode *next;
} Node, *ListNode;
void showPoint(ListNode node) {
while (node->next != NULL) {
printf("%d", node->val);
node = node->next;
}
//当没有下一个元素了
printf("%d", node->val);
}
/**
* 简单选择排序
*
* @param node
*/
void order(ListNode node) {
//已排好序的最大结点
ListNode orderMaxNode = node;
//当前正在比较的结点
ListNode curNode;
int temp;
while (orderMaxNode != NULL) {
//如果右边无序部分还有元素
curNode = orderMaxNode->next;
while (curNode != NULL) {
//每次把右边无序部分的最小值选择出来
if (curNode->val < orderMaxNode->val) {
temp = curNode->val;
curNode->val = orderMaxNode->val;
orderMaxNode->val = temp;
} else {
curNode = curNode->next;
}
}
//逐渐后移,最小值逐渐变大
orderMaxNode = orderMaxNode->next;
}
}
int main() {
ListNode node5 = (ListNode) malloc(sizeof(ListNode));
node5->val = 6;
node5->next = NULL;
ListNode node4 = (ListNode) malloc(sizeof(ListNode));
node4->val = 9;
node4->next = node5;
ListNode node3 = (ListNode) malloc(sizeof(ListNode));
node3->val = 3;
node3->next = node4;
ListNode node2 = (ListNode) malloc(sizeof(ListNode));
node2->val = 4;
node2->next = node3;
ListNode node1 = (ListNode) malloc(sizeof(ListNode));
node1->val = 1;
node1->next = node2;
printf("%s", "排序前顺序为:");
showPoint(node1);
order(node1);
printf("%s", "\n排序后顺序为:");
showPoint(node1);
return 0;
}