/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
//直接插入排序:后面的元素一直与前面的元素比较,小则前移
public class Solution {
public ListNode insertionSortList(ListNode head) {
//判断一下
if (head == null || head.next == null) {
return head;
} else {
//前两个数
//p指向有序列中第一个元素
ListNode p = head;
//q指向有序列中最后一个元素
ListNode q = p.next;
if (q.val < p.val){
int temp = p.val;
p.val = q.val;
q.val = temp;
}
//r指向无序列中第一个元素
ListNode r = q.next;
while (r != null) {
if (r.val >= q.val) { //当后一个数比前一个大时
q = r;
r = r.next;
} else if(r.val <= p.val) { //注意:此处是当无序列的第一个数比有序列的第一个数小时,直接将这个数插入到头节点
ListNode s = r;
r = r.next;
q.next = r;
s.next = p;
p = s;
} else {
ListNode t = p;
//关键一步:t = t.next从头找,直到找到第一个大于r.val的值,然后将r.val插入到它的前面;如果找到的是q的话,就将其插入到q前面
while(t.next != q && r.val >= t.next.val) {
t = t.next;
}
ListNode s = r;
r = r.next;
q.next = r;
s.next = t.next;
t.next = s;
}
}
return p;
}
}
}
补充
数组的插入排序
①、基本思想:在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。
②、算法描述:
从第一个元素开始,该元素可以认为已经被排序;
取出下一个元素,在已经排序的元素序列中从后向前扫描;
如果该元素(已排序)大于新元素,将该元素移到下一位置;
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
将新元素插入到该位置后;
重复步骤2~5。
public static int[] insertionSort(int[] array) {
if (array.length == 0)
return array;
int current;
for (int i = 0; i < array.length - 1; i++) {
current = array[i + 1];
int preIndex = i;
while (preIndex >= 0 && current < array[preIndex]) {
array[preIndex + 1] = array[preIndex];
preIndex--;
}
array[preIndex + 1] = current;
}
return array;
}