请将刚刚那段代码改写为选择排序
时间: 2024-04-23 14:28:02 浏览: 11
下面是将之前的代码改写为选择排序的版本:
```c
void sortById(DOUBLE_LINK_LIST* list, int order) {
if (list->size <= 1) {
return;
}
LINKED_NODE* current = list->head;
while (current != NULL) {
LINKED_NODE* minNode = current;
LINKED_NODE* nextNode = current->nextNode;
while (nextNode != NULL) {
EMPLOYEE* currentData = (EMPLOYEE*)current->data;
EMPLOYEE* nextData = (EMPLOYEE*)nextNode->data;
switch (order) {
case ASCEND:
if (nextData->employeeId < ((EMPLOYEE*)minNode->data)->employeeId) {
minNode = nextNode;
}
break;
case DESCEND:
if (nextData->employeeId > ((EMPLOYEE*)minNode->data)->employeeId) {
minNode = nextNode;
}
break;
default:
printf("Wrong order code!");
return;
}
nextNode = nextNode->nextNode;
}
if (minNode != current) {
EMPLOYEE* temp = (EMPLOYEE*)current->data;
current->data = minNode->data;
minNode->data = temp;
}
current = current->nextNode;
}
}
```
这个改写的版本使用了选择排序算法对双向链表中的EMPLOYEE结构体按照employeeId进行排序。
选择排序是一种简单直观的排序算法,它每次从待排序的元素中选择最小(或最大)的元素,将其放在已排序序列的末尾。具体而言,选择排序将待排序序列分为已排序和未排序两部分,每次从未排序的部分中选择最小(或最大)的元素,与已排序部分的末尾元素进行交换。这样每一轮选择排序都会确定一个最小(或最大)的元素放在正确的位置上,直到所有元素都被排序。
在这个改写的代码中,我们使用了嵌套的循环来实现选择排序。
外层循环用于遍历链表中的每个节点,表示当前已排序的部分。在每一轮外层循环中,我们将当前节点设置为最小节点,并遍历当前节点之后的未排序部分,找到最小(或最大)的节点。
内层循环通过遍历未排序部分的节点来找到最小(或最大)的节点。根据传入的`order`参数,使用`switch`语句判断是升序还是降序排序。如果是升序排序(`ASCEND`),则如果当前节点的员工ID小于最小节点的员工ID,就更新最小节点;如果是降序排序(`DESCEND`),则如果当前节点的员工ID大于最小节点的员工ID,就更新最小节点。
在内层循环结束后,如果找到的最小节点不是当前节点,就将当前节点和最小节点进行数据交换。
最后,外层循环继续进行下一轮排序,直到完成所有的比较和交换操作。
需要注意的是,默认情况下,如果传入的`order`参数不是`ASCEND`或`DESCEND`,会输出错误提示信息。