public class 冒泡排序 {
public static void main(String[] args) {
int a[] = { 1, 9, 6, 8, 5, 65, 65, 84, 1, 2, 5, 23, 7, 889 };
for (int i = 0; i < a.length - 1; i++) { //使用两个for循环遍历
for (int j = 0; j < a.length - i - 1; j++) { //减i是为了防止输出已经比较好的
if (a[j] > a[j + 1]) { //如果前面的数大于后面的数,则进行交换
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
System.out.println(Arrays.toString(a));
}
}
冒泡排序:基本思想:对比相邻的元素值,如果满足条件就交换元素值,把比较小的元素移动到数组前面,把比较大的移动到数组后面。
public class 选择排序 {
public static void main(String[] args) {
int array[] = { 63, 4, 24, 1, 3, 15 };
int index;
for (int i = 1; i < array.length; i++) {
index = 0;
for (int j = 1; j <= array.length - i; j++) { //循环
if (array[j] > array[index]) {
index = j; //获取一个循环内最大元素
}
}
int temp = array[array.length - i]; //将最大元素放到数组最后面
array[array.length - i] = array[index];
array[index] = temp;
}
System.out.println(Arrays.toString(array));
}
}
选择排序基本思想:将指定排序位置与其他数组元素分别对比,如果满足条件就交换元素值,这里不是交换元素值,而是把满足条件的元素与指定位置的排序位置交换。
public class 插入排序 {
public static void main(String[] args) {
int[] array = { 56, 5, 185, 56, 8, 646, 589, 63, 846, 351656, 6516, 654465 };
int i, j, t;
for (i = 1; i < array.length; i++) {
t = array[i];
j = i - 1;
while (j >= 0 && t < array[j]) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = t;
}
for (int q = 0; q < array.length; q++) {
System.out.print(array[q] + " ");
}
}
}
插入排序基本思想:先从数组中取出前两个数据,比较。在依次取出一个,与前两个比较比某个数大的放右边,比其小的放左边
public class Shell排序 {
public static void main(String[] args) {
int array[] = { 1, 5, 85, 416, 74, 123, 68, 46, 4, 68, 4, 61 };
int j, temp;
for (int r = array.length / 2; r >= 1; r /= 2) {
for (int i = r; i < array.length; i++) {
temp = array[i];
j = i - r;
while (j >= 0 && temp < array[j]) {
array[j + r] = array[j];
j -= r;
}
array[j + r] = temp;
}
}
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
}
Shell排序的基本思想:将n个元素分成n/2个数字序列,第1个和第n/2+1个数据为一对,每次循环使每个序列排号,再变成n/4个,再次排序。多次重复,直到序列减少到最后变成一个。
import java.util.Arrays;
public class 快速排序 {
public static void main(String[] args) {
int[] s = { 1, 5, 69, 5, 45, 1, 21, 23, 65, 9, 89, 87 };
quickSort(s,0,s.length-1);
System.out.println(Arrays.toString(s));
}
public static void quickSort(int[] s, int left, int right) {
int f, t;
int rtemp, ltemp;
ltemp = left;
rtemp = right;
f = s[(left + right) / 2];
while (ltemp < rtemp) { //左边的指针小于右边的指针
while (s[ltemp] < f) { //从左边开始找到比中间值大的指针
++ltemp;
}
while (s[rtemp] > f) { //从右边开始找到比中间值小的指针
--rtemp;
}
if (ltemp <= rtemp) { //如果右边开始的指针大于左边开始的指针,但左边的值大于右边,交换两处的值
t = s[ltemp];
s[ltemp] = s[rtemp];
s[rtemp] = t;
--rtemp; //向左运动
++ltemp; //向右运动
}
}
if (ltemp == rtemp) { //如果二者运动后在同一指针,左边指针后移
ltemp++;
}
if (left < rtemp) { //如果右边指针没有遍历到最左边,递归
quickSort(s, left, ltemp - 1);
}
if (ltemp < right) { //如果左边指针没有遍历到右边,递归
quickSort(s, rtemp + 1, right);
}
}
}
快排思想:设定一个分界值,通过该分界值将数组分成左右两部分,左边都小于分界值,右边都大于分界值
在递归左边,右边
import java.util.Arrays;
public class 堆排序 {
public static void main(String[] args) {
int a[] = { 1, 56, 9, 5, 6, 23, 21, 5, 62, 66 };
int n = 10;
int i, j, k;
int t;
for (i = n / 2 - 1; i >= 0; i--) {
while (2 * i + 1 < n) { //对树两边分开比较排序
j = 2 * i + 1; //做到右树叶比左树页大
if ((j + 1) < n) { if (a[j] < a[j + 1]) { //此处为了防止出现类似于10个结点的树的树叶情况 j++;
}
}
if (a[i] < a[j]) { //如果左树叶大于右树叶,交换
t = a[i];
a[i] = a[j];
a[j] = t;
i = j;
} else {
break;
}
}
}
for (i = n - 1; i > 0; i--) { //不在分开排序,总体排序
t = a[0]; //由下向上
a[0] = a[i];
a[i] = t;
k = 0;
while (2 * k + 1 < i) {
j = 2 * k + 1;
if ((j + 1) < i) {
if (a[j] < a[j + 1]) { //此处为了防止出现类似于10个结点的树的树叶情况
j++;
}
}
if (a[k] < a[j]) { //如果下面的大于上面的,交换二者
t = a[k];
a[k] = a[j];
a[j] = t;
k = j;
} else {
break;
}
}
}
System.out.println(Arrays.toString(a));
}
}
堆排序思想:先将树分成两部分,左右,每一级由左到右,递增,(在同一节点下);其次在在整个树中,从下往上排序,每次取出最上面的树排在最后,递归下去,即可排序。
import java.util.Arrays;
public class 合并排序 {
public static void main(String[] args) {
int s[] = { 5, 45, 6, 5, 2, 3, 23, 6, 65, 56, 98, 9, 7, 45, 4, 52 };
mergeSort(s, s.length);
System.out.println(Arrays.toString(s));
}
static void mergeOne(int a[], int b[], int n, int len) {
int i, j, k, s, e;
s = 0;
while (s + len < n) { //循环
e = s + 2 * len - 1;
if (e >= n) {
e = n - 1;
}
k = s;
i = s;
j = s + len;
while (i < s + len && j <= e) { //合并并排序
if (a[i] <= a[j]) { //两个数组第一位谁小谁先排,未排的元素等下次再次比较
b[k++] = a[i++];
} else {
b[k++] = a[j++];
}
}
while (i < s + len) {
b[k++] = a[i++];
}
while (j <= e) {
b[k++] = a[j++];
}
s = e + 1;
}
if (s < n) {
for (; s < n; s++) {
b[s] = a[s];
}
}
}
static void mergeSort(int a[], int n) { //开始排序
int h, len, f;
len = 1;
f = 0;
int p[] = new int[n];
while (len < n) { //排序次数
if (f == 1) { //互相交换排序
mergeOne(p, a, n, len);
} else {
mergeOne(a, p, n, len);
}
len = len * 2; //每次排序合并两个数组
f = 1 - f; //改变f的值
}
if (f == 1) { //解决只有一个数的数组
for (h = 0; h < n; h++) {
a[h] = p[h];
}
}
}
}
合并排序思想:将1个数组分成n个元素,相邻两项比较并合并,依次2和2比较并合并。。。。。