#插入排序``
将一个数据插入到已经排好序的有序数据中
将要排序的是一个乱的数组int[] arrays = {3, 2, 1, 3, 3};
在未知道数组元素的情况下,我们只能把数组的第一个元素作为已经排好序的有序数据,也就是说,把{3}看成是已经排好序的有序数据
一、第一趟排序
用数组的第二个数与第一个数(看成是已有序的数据)比较
如果比第一个数大,那就不管他
如果比第一个数小,将第一个数往后退一步,将第二个数插入第一个数去
int temp;
if (arrays[1] > arrays[0]) {
//如果第二个数比第一个数大,直接跟上
} else {
//如果第二个数比第一个数小,将第一个数后退一个位置(将第二个数插进去)
temp = arrays[1];
arrays[1] = arrays[0];
arrays[0] = temp;
}
System.out.println("呃呃呃" + arrays);
二、第二趟排序
用数组的第三个数与已是有序的数据{2,3}(刚才在第一趟排的)比较
如果比2大,那就不管它
如果比2小,那就将2退一个位置,让第三个数和1比较
如果第三个数比1大,那么将第三个数插入到2的位置上
如果第三个数比1小,那么将1后退一步,将第三个数插入到1的位置上
//第二趟排序--------------------
if (arrays[2] > arrays[1]) {
//如果第三个数比第二个数大,直接跟上
} else {
//如果第三个数比第二个数小,将第二个数往后退一个位置,让第三个数跟第一个数比
temp = arrays[2];
arrays[2] = arrays[1];
//如果第三个数比第一个大,那就插入到第二个数中
if (temp > arrays[0]) {
arrays[1] = temp;
} else {
//如果第三个数比第一个小,将第三个数插入到第一个数前面
int swapTemp = arrays[0];
arrays[0] = temp;
arrays[1] = swapTemp;
}
}
System.out.println("哈哈哈" + arrays);
#选择排序
选择算法
选择算法和冒泡的算法有相同的也有不同的
相同的都是他们都前边的数与后面的数进行对比,根据大小进行调换顺序
不同的在于冒泡排序是两两对比,决出最大的,然后在两两对比,决出第二大的,依次进行,最终排序完成
而选择排序是什么的套路呢,他刚开始把你要排的数分为有序数组和无序数组,有序数组最初是是0个数无序数组最初是全部,然后第一个循环就是挑选最小的数,他是怎么挑选的呢,从无序数组中一一挑选,挑选出最小的数,然后标记他所在的位置,如果他这个位置不是第一位,也就是你想要排位的位置的时候,他们之间就要进行数值的交换
按照牛逼的人的说法是
选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
2.1 算法描述
n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:
• 初始状态:无序区为R[1…n],有序区为空;
• 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1…i-1]和R(i…n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1…i]和R[i+1…n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
• n-1趟结束,数组有序化了。
表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。理论上讲,选择排序可能也是平时排序一般人想到的最多的排序方法了吧。
用代码进行解释、
package 算法;
public class Chose {
ublic static void main(String[] args) {
// TODO Auto-generated method stub
// 首先说明这是个选择排序的具体用法
int[] a = { 20, 44, 52, 64, 33, 654, 76 };
for (int j = 0; j < a.length - 1; j++) {//为什么是j < a.length - 1; ,原因是最后一个数不用进行排序了
int min = j;//这个min是定义的要排序数的位置
for (int i = j + 1; i < a.length; i++) {//为什么是int i = j + 1因为你第一个数是和第二个先进行比较的
//在进行循环的嵌套的时候首先我们还是要考虑内层循环
//选择循环的思路是从无序的数中一一对比,然后得出最大或者是最小的,进行位置标记,如果位置是他要进行
//排序数的位置的本身,就进行数字的转移
if (a[min] > a[i]) {//这个是判断排序的数与无序的数大小的的对比
min = i;//位置的标记
}
}
if (min != j) {//如果要进行排序的数的位置不是标记数的位置本身就要进行数值的互换
int temp;//进行数值的互换需要设一个中间变量作为临时储存器
temp = a[j];
a[j] = a[min];
a[min] = temp;
}
}
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
简单的可认为
记忆下标,记忆最小元素的位置
进行比较,交换值、
加外层循环重复进行比较,交换值