1.冒泡排序 Bubble sort
冒泡排序:从后向前让相邻元素两两比较,从而将最小元素移到最前,这个数就是气泡。
#include <stdio.h> main() { int a[] = {9, 8, 7, 6, 5, 4, 3, 2, 1}; int n = 9; int i, j, temp; for (i = 0; i < n; i++) //i为气泡 for (j = n-1; j > i; j--) if (a[j] < a[j-1]) { temp = a[j]; a[j] = a[j-1]; a[j-1] = temp; } for (int k = 0; k < n; k++) printf ("%d ", a[k]); }
冒泡排序可加入一个标志来提高效率
原理:比如只有序列只需交换最后两个元素,则在第一次for循环中会令bound = n-1,重而提升效率。
#include <stdio.h> main() { int a[] = {9, 8, 7, 6, 5, 4, 3, 2, 1}; int n = 9; int i, temp, bound, exchange; bound = 0; while (bound != n-1) { for (i = n-1; i > bound; i--) if (a[i] < a[i-1]) { temp = a[i]; a[i] = a[i-1]; a[i-1] = temp; exchange = i; } bound = exchange; } for (int k = 0; k < n; k++) printf ("%d ", a[k]); }
2.插入排序 Insertion sort
插入排序:将第一个元素看作有序数列,对未排序数据,从后向前与有序数列比较,若该数据小,则将与其比较的有序数列值向后移一位(不是交换二者位置),然后继续比较直到找到合适位置插入。
#include <stdio.h> main() { int a[] = {9, 8, 7, 6, 5, 4, 3, 2, 1}; int n = 9; int i, j, temp; for (i = 1; i < n; i++) //未排序数列 { temp = a[i]; for (j = i-1; j >= 0; j--) //己排序数列 if (temp < a[j]) a[j+1] = a[j]; a[j+1] = temp; } for (int k = 0; k < n; k++) printf ("%d ", a[k]); }
3.希尔排序法 Shell sort
希尔排序:希尔排序是插入排序的升级版,它有一个递减增量gap,当gap=1时排序完成,其实直接让gap=1也能达到目的,只是效率不高。下例是直接让gap=1的情况。
#include <stdio.h> main() { int a[] = {9, 8, 7, 6, 5, 4, 3, 2, 1}; int n = 9; int i, j, temp; for (i = 1; i < n; i++) //未排序 for (j = i-1; j >=0; j--) //己排序 if (a[j+1] < a[j]) { temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } for (int k = 0; k < n; k++) printf ("%d ", a[k]); }
对比这段代码和插入排序,区别是这里使用的是直接交换,不是真正的插入,这二者的区别应该不大吧。
一般在程序中取gap=n/2,再逐次除2,下面是完整的希尔排序。
#include <stdio.h> main() { int a[] = {9, 8, 7, 6, 5, 4, 3, 2, 1}; int n = 9; int gap, i, j, temp; for (gap = n/2; gap >= 1; gap /=2) for (i = gap; i < n; i++) for (j = i-gap; j >= 0; j -= gap) if (a[j+gap] < a[j]) { temp = a[j]; a[j] = a[j+gap]; a[j+gap] = temp; } for (int k = 0; k < n; k++) printf ("%d ", a[k]); }