一、选择排序法
选择排序法的思想在于先遍历一次数组(集合)(第一次是0-a.length,第二次是从1-a.length),在遍历的过程中,前一个元素与后一个元素进行比较,如果前一个元素大于后一个,则记录后一个元素的索引(记为min),并将这两个数进行交换,接着a[min]与下一个元素比较,如果后者小于前者,则将后者下标记录,并交换,以此类推。这样第一次遍历结束后,a[0]位置元素就是这个集合中最小的元素。第二次遍历结束后a[1]就是这个数组中第二小元素,以此类推。总共进行了(a.length-2)次的遍历,
// 选择排序
private static void select_sort(int a[]) {
int i, j, t, min;**重点内容**
for (i = 0; i < a.length - 1; i++) {
min = i;
for (j = i + 1; j < a.length; j++) {
if (a[min] > a[j])
min = j;
}
if (min != i) {
t = a[min];
a[min] = a[i];
a[i] = t;
}
}
}
二、冒泡排序法
冒泡排序法与选择排序法极其相似,区别在于,选择排序是从前往后排序,而冒泡是从后往前排序。他是在一次遍历中前一个与后一个比较,如果后者小于前者,则将前者向后移一位,这样的逐次的前后比较移位,就会将最大一个元素移到数组的最末尾,第二次遍历比较移位就会将数组中第二小的元素移位到倒数第二的位置,以此下去,数组中的元素就按升序排好了。
// 冒泡排序法
private static void bubble_sort(int a[]) {
int i, j, t;
for (i = 0; i < a.length - 1; i++) {
for (j = 0; j < a.length - 1 - i; j++) {
if (a[j] > a[j + 1]) {
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
}
三、二分法排序
二分法排序是在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到start>end,然后再把第i个元素前1位与目标位置之间的所有元素后移,再把第i个元素放在目标位置上。该方法也是一种从前往后的排序。
// 二分法
private static void half_sort(int a[]) {
int i, j, start, end, mid, t;
for (i = 0; i < a.length; i++) {
start = 0;
end = i - 1;
mid = 0;
t = a[i];
while (start <= end) {
mid = (start + end) / 2;
if (a[mid] > t) { // 要排序元素在已经排过序的数组左边
end = mid - 1;
} else {
start = mid + 1;
}
}
for (j = i - 1; j > end; j--) {// 找到了要插入的位置,然后将这个位置以后的所有元素向后移动
a[j + 1] = a[j];
}
a[end + 1] = t;
}
}
四、快速排序法
快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。
// 快速排序(两端交替着想中间扫描)
private static void quick_sort(int a[], int low, int high) {
int pivotkey = a[low];
int i = low, j = high;
if (low >= high)
return;
while (i < j) {
while (i < j && a[j] >= pivotkey)
j--;
a[i] = a[j];
while (i < j && a[i] <= pivotkey)
i++;
a[j] = a[i];
}
a[i] = pivotkey;
quick_sort(a, low, i - 1);
quick_sort(a, i + 1, high);
}
五、插入排序法
从第二个数开始,先将第二个数做一个基准。
第二个数同前一个数比较,小于则用前一个数覆盖第二个数, 然后将副本放在前一个数前面
再将第三个数做一个副本取出,第三个数同前一个数比较,小于则用前一个数覆盖第三个数(此时第二个数位置空闲), 然后用副本同前一个数的前一个数比较,如果小于,则用前一个数的前一个数覆盖在原本的第二个位置上(此时第一个位置空闲), 将副本放入即可。
4.将数组中接下来的数依次做与3类似步骤,以3类推将副本往前作比较。直到副本不小于比较的数则该轮插入结束
5.重复4步骤,直到最后一个数
//插入排序法
private static void insert_sort(int a[]) {
for (int j = 1; j < a.length; j++) {
int key = a[j];
int i = j - 1;
while (i >= 0 && a[i] > key) {
a[i + 1] = a[i];
i = i - 1;
}
a[i + 1] = key;
}
}