前言
看完了牛客网上的买的算法课程,准备首先从基础的数据结构和算法开始写。
本篇先从基础的排序开始,需要要掌握的有冒泡排序,选择排序和 插入排序。
冒泡排序
算法思路:
1.第一次循环:从0到n-2(即0<=i<n-1-0),每个位置上的数拿本身和后一位相比,如果比后一位大就交换两个位置的值。
2.第二次循环:从0到n-3即(即0<=i<n-1-1),操作同第一次循环一样。
….多次循环后….
3.第n-1次循环:0位置上的数(即0<=i<n-1-(n-2)),操作同第一次循环。
说明:为了实现本身和后一位相比直到最后,要用内层循环实现,范围区间已在上面给出,外层共有n-1次循环,我们可以写出代码如下。
代码实现:
public static int[] BubbleSort(int[] A, int n) {
// 给变量赋初识值
int temp,i = 0,j = 0;
//外层循环计数如上面算法思想的减数部分
for(;i < n-1;++i){
//内层循环来实现相邻两个比较
for(;j<n-i-1;++j){
//前一个比后一个大,冒泡到最后
//说明:逆序排列的话条件相反
if(A [j] > A [j+1]){
temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
}
}
}
return A;
}
选择排序
算法思想
1.第一次循环:从0到n-1(即1<=i<n),选出区间最小值放到位置0上。
2.第二次循环:从1到n-1(即2<=i<n),选出最小值放到位置1上。
….多次循环后….
3.第n-1次循环:从n-2到n-1(即n-2<=i<n),选出最小值放在位置n-2上。
说明:内层循环选取区间内的最小值,循环区间上面已给出,利用附加空间的int k来存储最小值的索引,最后和对应位置值交换,外层循环循环n-1次。根据以上思路可以写出实现代码。
代码实现
public static int[] selectSort(int[] data){
//初始化变量,需要额外的k存最小智的索引
int i, j, k, tmp = 0;
//外层循环,0-n-2,循环n-2次
for (i = 0; i < data.length - 1; i++) {
//记录下区间第一个值
k = i;
//内层循环从区间第二个值开始比较
for (j = i + 1; j < data.length; j++)
//更新最小值索引
if (data[j] < data[k])
k = j;
//如果最小值索引不是当前位置,交换他们的值
if (k != i) {
tmp = data[i];
data[i] = data[k];
data[k] = tmp;
}
}
return data;
}
插入排序
算法思想
1.第一次循环:从位置1上的数开始,与它的前一位比较,如果比他小就交换它们的值,并从它的前一位开始继续向前比较,直接当前位置比前一个位置大,停止循环,或者直到和位置0上的数相比,比较结束,此时0——1区间一定有序。
2.第二次循环:从位置2上的数开始,与它的前一位比较,如果比他小就交换它们的值,并从它的前一位开始继续向前比较,直接当前位置比前一个位置大,停止循环,或者直到和位置0上的数相比,比较结束,此时0——2区间一定有序。
….多次循环后….
3.第n-1次循环:从位置n-1上的数开始,与它的前一位比较,如果比他小就交换它们的值,并从它的前一位开始继续向前比较,直接当前位置比前一个位置大,停止循环,或者直到和位置0上的数相比,比较结束,此时0——n-1区间即整个数列就有序了。
说明:外层循环循环n-1次。从1到n-1,即1<=i<n。内层循环首先取当前索引的前一位索引,与当前索引位置的值比较,如果当前索引位置较小就交换当前索引和前一位的值,并从它的前一位开始继续向前比较。根据以上思路可以写出实现代码。
代码实现
public static int[] insertionSort(int[] A, int n) {
// 外层循环从1——n-1,共n-1次。
for(int i=1;i<n;++i){
//j从当前索引i前一位开始,每次比较后j递减更新当前索引位置
for(int j=i-1;j>=0;--j){
//比较前一位和当前索引位置,如果当前位置小则交换
if(A[j]>A[j+1]){
int temp=A[j];
A[j]=A[j+1];
A[j+1]=temp;
}
//如果当前位置大,停止内层循环
else
break;
}
}
return A;
}
明天讲其他几种,最后试着插入一个动图!!!

说明
文中出现的图片,文字描述有些来自互联网,但是出处无法考究,如果侵犯您的相关权益,请联系我,核实后我会马上加上转载说明。谢谢!!!