排序
个人对于几个排序的认识:
- 插入排序:将要排序的数组分成两个部分,有序部分,待插入部分。把无序的部分插入到有序的当中,遇到第一个比插入元素要大的元素,该插入元素插入到这个元素的位置。例子如下:
一个无序数组int a[]={50,10,30,5,77}。
第一轮:我们先假设50是有序的部分,10是待插入的。
10和50比较,
50>10------一次
本轮排序后的顺序:10,50。
第二轮:10,50有序部分,我们再插入30,拿30和10,50,依次比较,
10,30,50------一次(和50比较)
10,30,50-----二次(和10比较)这里因为30比10大,所以不用调换位置。
本轮排序后的顺序:10,30,50。
第三轮:10,30,50有序的,5待插入的。拿5依次和它们比较,
10,30,5,50------一次
10,5,30,50------二次
5,10,30,50-----三次
本轮排序后的顺序:5,10,30,50
第四轮:5,10,30,50是有序的,77是待插入的。拿77依次和它们比较,
5,10,30,50,77------一次
5,10,30,50,77------二次
5,10,30,50,77------三次
5,10,30,50,77------四次
本轮排序后的顺序:5,10,30,50,77
这里77虽然都比它们大,但是依然要和它们依次比较,(不要认为不用比较,这次是是因为77比它们大,下次如果是45,或者比5还小的数呢?如:4,3。。。所以一定要比较)
总结一下:插入排序,可以理解成,先固定第一个数,再选后一个数作为待插入的,比较大小,然后交换位置,小的排前面,大的排后面。随着有序部分的数增多,后面待插入的数要逐个依次和有序部分的数比较大小
public static void main(String[] args){
int a[]={50,10,30,5,77};//定义一个数组
System.out.println("原数组:\n"+Arrays.toString(a));
for(int i=1;i<a.length;i++){//外层循环,控制轮数,轮数=数组长度-1,这里i从1开始是考虑到下面j的取值,假设i=0,j=i-1就没有意义了,所以i=1开始
for(int j=i;j>0;j--){//内层循环,控制比较次数
if(a[i]<a[j-1]){
int temp=a[j-1];
a[j-1]=a[i];
a[i]=temp;
}
}
}
System.out.println("插入排序: \n"+Arrays.toString(a));
}
删除节点的实现:
ListNode removeNthFromEnd(ListNode head, int n) {
// write your code here
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode fast = dummy;
ListNode slow = dummy;
while (fast != null && n > -1) {
fast = fast.next;
n–;
}
while (fast != null) {
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return dummy.next;
}