一、直接插入排序
1、原理:从待排序的数中选出一个来,插入到前面的合适位置。
2、适用场景:基本有序的数据
3、代码实现:
static int data[] = {12, 6, 17, 108, 97, 93, 256, 1024};
public static void insertSort() {
int tmp, i = 0;
for(int j = 0; j<data.length; j++) {
tmp = data[j];
i = j - 1;
while(i >= 0 && tmp < data[i]) {
data[i+1] = data[i];
i--;
}
data[i+1] = tmp;
System.out.println();
print();
}
}
二、选择排序
1、原理:与直接插入排序正好相反,选择排序是从待排序的数中选出最小的放在已经排好的后面,这个算法选数耗时
2、代码实现:
static int data[] = {12, 6, 17, 108, 97, 93, 256, 1024};
public static void selectSort() {
int i, j, k, tmp = 0;
for(i=0; i<data.length-1; i++) {
k = i;
for(j=i+1; j<data.length; j++) {
if(data[j] < data[k]) {
k = j;
}
}
if(k != i) {
tmp = data[i];
data[i] = data[k];
data[k] = tmp;
System.out.println();
print();
}
}
}
三、冒泡排序
1、原理:小的数一点一点向前起泡,最终有序。
2、代码实现:
static int data[] = {12, 6, 17, 108, 97, 93, 256, 1024};
public static void bubbleSort() {
int i, j, tmp = 0;
for(i=0; i<data.length - 1; i++) {
for(j=data.length - 1; j>i; i--) {
if(data[j] < data[j-1]) {
tmp = data[j];
data[j] = data[j-1];
data[j-1] = tmp;
}
}
}
}
四、快速排序
1、原理:设置两个指针:i和j,分别指向第一个和最后一个,i像后移动,j向前移动,选第一个数为标准(一般这样做,当然快排的关键就是这个“标准”的选取),从后面开始,找到第一个比标准小的数,互换位置,然后再从前面,找到第一个比标准大的数,互换位置,第一趟的结果就是标准左边的都小于标准,右边的都大于标准(但不一定有序),分成两拨后,继续递归的使用上述方法,最终有序!
2、适用场景:基本无序的数据
3、代码实现:
public static void quickSort(int data[], int start, int end) {
int i, j;
i = start;
j = end;
if((data == null) || (data.length == 0)) {
return;
}
while(i < j) {
// 以start下标的数据为key,从右向左依次扫描
while(i < j && data[i] <= data[j]) {
j
}
// 找出第一个比key小的,交换位置
if(i < j) {
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
while(i < j && data[i] < data[j]) {
// 左侧扫描(此时a[j]存着key的值)
i++;
}
// 找出第一个比key大的,交换位置
if(i < j) {
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
// 递归调用,把key前面的完成排序
if(i-start > 1) {
quickSort(data, 0, i-1);
}
// 递归调用,把key后面的完成排序
if(end-j > 1) {
quickSort(data, j+1, end);
}
}