java算法每日一练2021-1-15

1.冒泡排序

(1)通过每一次遍历获取最大/最小值

(2)将最大值/最小值放在尾部/头部

(3)然后除开最大值/最小值,剩下的数据在从头进行遍历获取最大/最小值

代码实现:

public static void main(String[] args) {
int test[] = {1,2,3,8,5,7};//定义数组
//外层循环(i+1)的值相当于已经比对过得次数
for(int i = 0; i < test.length; i++){
/*内层循环对数值进行比较,因为每次比较都是从头开始,所以j初始值为0,
      而经过i+1次比对,数组后i+1位数据已经排好序了,所以J的最大值需要减去(i+1)*/
for(int j = 0; j < test.length-i-1; j++){
//进行数值比对,大的值往后挪一位
if(test[j] > test[j+1]){
int temp = test[j+1];
test[j+1] = test[j];
test[j] = temp;
}
}
}
//输出结果
for(int k = 0; k < test.length; k++){
System.out.println(test[k]);
}
}

输出结果:

 

2.选择排序

(1)将第一个值看成最小值

(2)然后和后面的值进行比较找出最小值和下标

(3)交换本次遍历的起始值和最小值

代码实现:

public static void main(String[] args) {
int test[] = {1,2,3,8,5,7};//定义数组
//外层循环(i+1)的值相当于已经比对过得次数
for(int i = 0; i < test.length; i++){
//假设第一个值为最小值
int min_num = test[i];
//最小值下标
int min_index = i;
for(int j = i+1; j < test.length; j++){
//如果后续有比当前最小值小的数值,进行记录,该记录为包含起始下标后所有数值的最小值数据
if(min_num > test[j]){
min_num = test[j];
min_index = j;
}
}
//将最小值与起始值调换数据
int temp = test[i];
test[i] = min_num;
test[min_index] = temp;
}
//输出结果
for(int k = 0; k < test.length; k++){
System.out.println(test[k]);
}
}

运行结果:

3.插入排序

从第二个数值开始,如果第二个数据比第一个小,则交换。然后在用第三个数据比较,如果比前面小,则插入。否则说明该数值亦大于之前的数值,退出内层循环。

代码实现:

public static void main(String[] args) {
int test[] = {1,2,3,8,5,7};//定义数组
//从第二个数值开始
for(int i = 1; i < test.length; i++){
//与前面排好队的数值进行比较插入合适位置
for(int j = i; j > 0; j--){
if (test[j] < test[j - 1]) {
int temp = test[j - 1];
test[j - 1] = test[j];
test[j] = temp;
} else {
//如果大于,亦大于该数值前排好序的数值,说明插入完毕,退出内层循环
break;
}
}
}
//输出结果
for(int k = 0; k < test.length; k++){
System.out.println(test[k]);
}
}

运行结果:

4.快速排序

(1)确认列表第一个数据为中间值,第一个值看成空缺。

(2)设置高低两个指针,开始高指针向左移动,如果遇到小于中间值的数据,则将这个数据赋值到低指针空缺,并且将高指针的数据看成空缺值。然后先向右移动一下低指针,并且切换低指针移动。当低指针移动到大于中间值的时候,赋值到高指针空缺的地方。然后先高指针向左移动,并且切换高指针移动。循环重复操作。

(3)直到高指针和低指针相等时退出,并且将中间值赋值给该指针位置。

(4)然后将中间值的左右两边进行快速排序。

代码实现:

public static void main(String[] args) {
int test[] = {1, 2, 3, 8, 5, 7};//定义数组
//快速排序
int low = 0;
int high = test.length - 1;
quickSort(test, low, high);
//输出结果
for (int k = 0; k < test.length; k++) {
System.out.println(test[k]);
}
}
public static void quickSort(int[] test, int low, int high) {
//如果高指针与低指针指向一个数值,退出
if (high - low < 1) {
return;
}
//高低指针移动的标志,true高指针false低指针
boolean flag = true;
//记录指针的起始位置
int start = low;
int end = high;
//默认中间值为低指针的第一个值
int midValue = test[low];
while (true) {
//高指针移动
if (flag) {
//如果列表右方的数据大于中间值,则向左移动
if (test[high] > midValue) {
high--;
} else if (test[high] < midValue) {
//如果小于,则覆盖最开始的低指针值,并且移动低指针,标志位改成从低指针开始移动
test[low] = test[high];
low++;
flag = false;
}
} else {
//如果低指针数据小于中间值,则低指针向右移动
if (test[low] < midValue) {
low++;
} else if (test[low] > midValue) {
//如果低指针的值大于中间值,则覆盖高指针停留时的数据,并向左移动高指针。切换为高指针移动
test[high] = test[low];
high--;
flag = true;
}
}
//当两个指针的位置相同时,则找到了中间值的位置,并退出循环
if (low == high) {
test[low] = midValue;
break;
}
}
//目前数组中间值左边的小于中间值。右边的大于中间值。
//然后在对左右两边的列表在进行快速排序
quickSort(test, start, low -1);
quickSort(test, low + 1, end);
}

运行结果:

 

 

posted on 2021-01-15 11:52  孟庆淋  阅读(90)  评论(0编辑  收藏  举报

导航