帮我写一段归并排序的代码
时间: 2023-06-30 16:17:46 浏览: 80
好的,以下是归并排序的 Python 代码实现:
```python
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
i, j = 0, 0
res = []
while i < len(left) and j < len(right):
if left[i] <= right[j]:
res.append(left[i])
i += 1
else:
res.append(right[j])
j += 1
res += left[i:]
res += right[j:]
return res
```
这段代码实现了归并排序,先将原始列表不断二分,直到每个子序列只有一个元素,然后将相邻的两个子序列合并成一个有序序列,最后将所有子序列合并成一个有序序列,返回给调用者。
相关问题
请用归并排序帮我写一段排序链表的代码,语言用JAVA
在Java中,由于链表的特点(数据结构),我们可以直接对链表节点进行操作,不需要像数组那样预分配额外的空间。这里是一个基于迭代方式的归并排序链表的简化版本,我们先将链表拆分成两个独立的有序链表,然后再合并它们:
```java
import java.util.Stack;
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public class MergeSortLinkedList {
public ListNode mergeSortList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
// 使用栈来辅助归并过程
Stack<ListNode> stack = new Stack<>();
ListNode slow = head, fast = head.next;
// 将链表拆成若干个连续段
while (fast != null && fast.next != null) {
stack.push(slow);
slow = slow.next;
fast = fast.next.next;
}
stack.push(slow); // 最后一个段
ListNode sortedTail = null;
while (!stack.isEmpty()) {
ListNode firstHalf = stack.pop(); // 取出一个段
ListNode secondHalf = stack.empty() ? null : stack.peek(); // 获取下一个段(如果存在)
ListNode current = firstHalf, temp = firstHalf;
while (secondHalf != null) {
// 比较并合并两个链表
if (current.val <= secondHalf.val) {
temp.next = current;
current = current.next;
} else {
temp.next = secondHalf;
secondHalf = secondHalf.next;
}
temp = temp.next;
}
temp.next = secondHalf; // 如果第二半链表未遍历完,直接接上
if (sortedTail != null) {
sortedTail.next = firstHalf; // 连接到已经排序好的链表尾部
} else {
head = firstHalf; // 如果这是第一个段,就替换为头节点
}
sortedTail = current; // 更新排序后的链表尾部
}
return head;
}
public static void main(String[] args) {
ListNode head = new ListNode(4);
head.next = new ListNode(2);
head.next.next = new ListNode(1);
head.next.next.next = new ListNode(3);
MergeSortLinkedList sorter = new MergeSortLinkedList();
ListNode sortedHead = sorter.mergeSortList(head);
printList(sortedHead);
}
private static void printList(ListNode node) {
while (node != null) {
System.out.print(node.val + " ");
node = node.next;
}
System.out.println();
}
}
```
在这个代码中,`mergeSortList`函数通过不断取堆栈顶部的链表段,将其与下一段合并,直到所有链表都被排序。请注意,这个解决方案保留了链表原有的空间效率,因为它只用到了常数级别的额外空间。
帮我写一段排序的python代码
当然可以!以下是一个简单的 Python 冒泡排序代码示例:
```python
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
```
使用示例:
```python
arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = bubble_sort(arr)
print("排序后的数组:")
for i in range(len(sorted_arr)):
print("%d" % sorted_arr[i])
```
输出结果:
```
排序后的数组:
11
12
22
25
34
64
90
```
当然,这只是冒泡排序的一个简单示例,还有很多其他的排序算法可以实现,例如快速排序、归并排序等等。
阅读全文