目录
冒泡排序
冒泡排序是基于交换的排序,又称之为直接交换排序.
下图冒泡排序的动态演示:
其大致思路如下:
1.遍历数组未排序的部分
2.直接比较两个相邻数据,若第一个数据大于第二个数据,则进行交换。
其问题难点再与如何遍历数组当中未排序的部分
- 通过上图的演示,我们可以看出每进行一次遍历数组,就会将该数组最大的数据置后,而我们完成一次遍历数组之后,就可以不用再次比较这个最大的数据。
- 还需额外注意一点,若某次遍历完一次数组之后,没有进行交换数据的操作,则说明该数组已经是有序数组,则退出循环即可,从而提高效率。【所以我们可以设置一个标志变量flag来进行对判断】
public void bubblbubbleSort(int[] arr) {
for (int i = arr.length-1; i > 0; i--) {
boolean flag=true;
for (int j = 0; j < i; j++) {
if(arr[j]>arr[j+1]) {
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
flag=false;
}
}
if(flag) {
break;
}
}
插入排序、希尔排序
(1)插入排序:
插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
大致思路:
1.假设数组的第一个数据,即下标为0的数据是已经排好顺序的。
2.依次提取下标1到最后一个下标的数据,将该数据与此下标之前数据进行比较大小,将其插入到
此下标之前的数列当中的合适位置。
public void insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int t=arr[i];
int j;
for (j = i-1; j >=0 && t<arr[j]; j--) {
arr[j+1]=arr[j];
}
arr[j+1]=t;
}
}
(2)希尔排序
D. L. Shell在1959年提出,又称为缩小增量排序。
基本思想:“跳跃式”的插入排序,在数据基本有序时,可以减少
比较和复制的次数。
希尔排序是对插入排序的进一步改进
采用了分组的思想,按照一定的步长将数组进行划分。
public void shellSort(int[] arr) {
int d=arr.length;
while((d/=2)>=1) {
shellSort(arr,d);
}
}
public void shellSort(int[] arr, int d) {
for (int i = d; i < arr.length; i++) {
int t=arr[i];
int j;
for (j = i-d; j>=0 && t<arr[j]; j-=d) {
arr[j+d]=arr[j];
}
arr[j+d]=t;
}
}
直接选择排序
每次遍历未排序的数组将数组当中最小的元素放在未排序数组的部分的第一个元素
public void selectMinSort(int[] a) {
int n=a.length-1;
for (int i = 0; i < n; i++) {
int pos=i;
for (int j = i+1; j <=n; j++) {
if(a[pos]>a[j]) {
pos=j;
}
}
int temp=a[i];
a[i]=a[pos];
a[pos]=temp;
}
}
本文图片参考:排序讲解