1.冒泡排序
这种排序方式是最简单的,4, 3, 6, 7来当作一个例子(从小到大排序),每一次进行排序先选择第一个4与后面的3进行比较然后4比3大交换位置,4与6比较6大不变,6与7比较7大不变,这样一趟之后最大的值就到了最后的位置。依次进行一共是n-1次就完成了排序。
public class Test15 {
public static void main(String[] args) {
int arr[] = { 4, 3, 6, 7, 2, 9, -4, -90, 67, 88, 4 };
buddleSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void buddleSort(int arr[]) {
int temp = 0;
boolean flag = false;//这里是一个优化,进行一个循环的比较之后,发现没有交换了,说明已经排序好了
for (int i = 1; i < arr.length; i++) {//一共需要n-1次
for (int j = 0; j < arr.length - i; j++) {//arr.length - i,这里的意思是,经过一个循环之后最大的值已经到了最后了,就没有必要再去比较了
if (arr[j] > arr[j + 1]) {//当这个数大于后一个数的时候,进行交换
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = true;//这里是一个标志,表示进行了交换
}
}
if (!flag) {//当flag=false的时候就出现了没有交换的情况,就没有必要继续循环了
break;
} else {
flag = false;//把前面交换后的true变为false
}
}
}
}
2.选择排序
选择排序也是一个内排序,4, 3, 6, 7,还是这个例子,你第一次选择是在arr[0]-arr[n]中选择最小的(升序)的值然后与arr[0]进行交换,第二次就是在arr[1]-arr[n]中选择最小的值然后与arr[1]进行交换,一直重复就可以了。
public class Test16 {
public static void main(String[] args) {
int arr[] = { 4, 3, 6, 7, 2, 9, -4, -90, 67, 88, 4 };
selectSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void selectSort(int arr[]) {
for (int i = 0; i < arr.length - 1; i++) {//只需要n-1次就可以了
int min = arr[i];//先选择数组中的一个值为最小值
int minlength = i;//记录最小值的下标
for (int j = i + 1; j < arr.length; j++) {//从最小值的后一位开始,一直到最后
if (min > arr[j]) {//当最小值大于arr[j]
min = arr[j];//重新选择最小值
minlength = j;//重新记录最小值下标
}
}
if (i!=minlength) {//这里是为了不必要的交换,因为要是原来选择的就是最小值了就没有必要交换了
arr[minlength] = arr[i];
arr[i] = min;
}
}
}
}
3.插入排序
最后一种排序了,这个排序也是很简单,其实排序中难的还是快速排序,归并排序和堆排序,其他的还是简单的。
4, 3, 1, 7,还是这个例子,插入排序就是,先选择第一个4,然后再选择4后面一个就是3,3和4进行比较如果3小于4就让4移到3的位置,3就移到4的位置,3 4 1 7.然后选择1,1与4比较,1小于4把1与4交换,1再与3比较,1小于3,再交换,就是这样,直到最后一个。
public class Test17 {
public static void main(String[] args) {
int arr[] = { 4, 3, 6, 7, 2, 9, -4, -90, 67, 88, 4 };
insertSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void insertSort(int arr[]) {
for (int i = 1; i < arr.length; i++) {//从数组第二个开始
int insert=arr[i];//保存第二个数,就是要往前面插入的数
int insetIndex=i-1;//记录要插入的数的前一个
while (insetIndex>=0&&insert<arr[insetIndex]) {//当要插入的数小于前面的数
arr[insetIndex+1]=arr[insetIndex];//这里大家可能觉得有点怪,这是因为虽然往后移了,但是要插入的数我是保存的,所以没有丢失
insetIndex--;//这里要进行减减的操作,因为要往前面继续判断,前面可能还有值会小于要插入的值
}
arr[insetIndex+1]=insert;//insetIndex+1这个大家需要思考一下,这是因为前面在循环里是做了一个减减的操作,这里必须要加上,
//要是没有进入循环这里也是要进行加的操作因为是要插入到后面,其实就没有动
}
}
}