我自己最近在学数据结构,发现了个问题,就是看网上的视频能够明白想要学习代码的原理,但在尝试自己实现算法时常常会出现许多问题,并且我认为只有真正独立的实现一种算法的代码才能算掌握了它,谨以此篇,记录我对插入排序的理解。
1.基本原理(个人理解,如有错误请各位大佬指正)
选择任意下标数字(一般选择第一个也就是下标为0的数)下面将该数称为中轴变量,使用双指针,两个指针分别指向数组头部和尾部,遍历剩余数字,当左指针指向大于中轴变量停止左指针遍历,进行右指针遍历,当右指针所指向的数小于中轴变量时停止右指针遍历,交换左右指针所指的数,继续进行遍历直到左指针大于或等于右指针时停止,并将中轴变量与右指针所指的数交换,这样就完成了对中轴变量位置的排序(此时中轴变量左边的数都小于它右边的数都大于它,它所在的位置就是排序的最终的正确的位置)此过程中关于左右指针遍历次序可以调换。接着对中轴变量左右子数组进行同样的操作,直到最终子数组为单个数字为止(单个数字本身就是有序的)。
2.图示
列如数组 49 20 34 51 22 11 65
这里仅仅演示第一次排序,剩下的数同理。
3.代码
public static void Quick_Sort(int num[],int l,int r) {//快排
if (l > r) return;//如果左指针大于右指针直接结束
int povit = num[l];//默认中轴变量是数组下标最小的数
int i = l ;
int j = r;
while (i < j) {
while (num[i] <= povit && i < r)//左指针当遍历到比中轴变量大的数时停下
i++;
while (num[j] > povit)//右指针当遍历到比中轴变量小的数时停下
j--;
if (i < j) {//如果此时左右指针位置正常就进行交换
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
num[l] = num[j];//这里有个小问题,看了许多大佬的文章都说交换时左右指针等效
num[j] = povit;//但在实际应用时可以发现如果使用左指针可能
Quick_Sort(num, l,j-1);//产生问题(当左指针大于右指针时)
Quick_Sort(num, j + 1, r);//这里交换右指针一定能够保证交换的数比中轴变量小
}
参数是待排数组、头下标、尾下标
4.测试
public static void main(String[] args) {
int num[]={49,20,34,51,22,11,65};
Quick_Sort(num,0,num.length-1);
for (int i:num)
System.out.println(i);
}
测试成功!



