三大排序算法
冒泡排序
插入排序
选择排序
冒泡排序:就是冒泡,就是不断地将我们无序的数组,通过移动,经历n次,从小到大排列出来。
具体的算法如下: 简单排序–冒泡排序
int[] mao = { 3, 44, 38, 5, 47, 15, 36 };
// 外循环只是循环几次
for (int i = mao.length - 1; i > 1; i--) {
// 内循环每循环一次就会有拍好一位,如最大值
System.out.println("第" + (mao.length - i) + "次循环");
for (int j = 0; j < i; j++) {
if (mao[j] > mao[j + 1]) {
// 如果第一个比第二大,那就换位子
int temp = mao[j];
mao[j] = mao[j + 1];
mao[j + 1] = temp;
}
for (int k = 0; k < mao.length; k++) {
System.out.print(mao[k] + " , ");
}
System.out.println();
}
}
选择排序:就跟大牌一样,先是乱序的,但是我们一张一张摸到的牌进行排序。
具体算法:// 选择排序
System.out.println("选择排序");
int[] selectInt = { 120, 110, 100, 90, 80, 70, 45 };
/**
* 第一步: 原理是都和第一项(下标0)比较,小的则替换
*
* 外层变量设置为outer,内层变量为inner,最小数据存放下标min。
* selectInt.length-1一共7个数比6次就可以了。selectInt.length内部是从下标1开始的,这里就不要再-1了,
* 否侧少比较一次
*/
int min;
for (int outer = 0; outer < selectInt.length - 1; outer++) {
min = outer;
// 内循环每循环一次就会有拍好一位,如最大值
System.out.println("第" + (outer + 1) + "次循环");
for (int inner = outer + 1; inner < selectInt.length; inner++) {
// 如果后六个数中,有小于第一项(下标0)的,就调换下标
if (selectInt[inner] < selectInt[min]) {
min = inner;
}
}
int temp = selectInt[outer];
selectInt[outer] = selectInt[min];
selectInt[min] = temp;
for (int k = 0; k < selectInt.length; k++) {
System.out.print(selectInt[k] + " , ");
}
System.out.println();
}
/**
* 第1次循环 45 , 110 , 100 , 90 , 80 , 70 , 120 ,
*
*/
插入排序:有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)
/**
* 从第二项开始,第一项默认为有序
* 1:把第二项数据暂存,和第一项比较,如果第一项>第二项则调换,
* 2:把第三项数据暂存,和第二项比较,如果第二项>第三项则调换, 这时调换后的第二项还要和第一项比较,然后再判断调换,从当前下标开始向左遍历凡是大于temp的数据,下标
* 都均向右移动一位(调换)。
* 以此类推 ........
*
*
* 很多人估计不理解为什么从第二项开始,而不是从第一项,
* 这里我稍微做一下解释,插入排序就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,
* 我们对于一个数组,不知道哪里是排序好的,可能是前三条,也可能不是有序的,我们这时就要假设一段已经排好序的数组,我们直接取前三项的话,
* 不一定是排序好的, 我们取前一项的话,就一个数据肯定是排序好的,所以就从第二项开始,默认第一项已经排序好了。这就是由来。
*/
int insertElems[] = { 23, 4, 5, 34, 56, 21 };
int inner, outer;
for (outer = 1; outer < insertElems.length; outer++) {
int temp = insertElems[outer];// 把第二项暂存
inner = outer;
// (第一项>第二项)
while (inner > 0 && insertElems[inner - 1] > temp) {
insertElems[inner] = insertElems[inner - 1];
inner--;
}
insertElems[inner] = temp;
for (int k = 0; k < insertElems.length; k++) {
System.out.print(insertElems[k] + " , ");
}
System.out.println();
}