#include<iostream> using namespace std; //辅助函数,交换两数之值 template<class T> void mySwap(T &x, T &y){ T temp = x; x = y; y = temp; } const int size = 10; //一、用直接插入排序法对数组a中元素进行升序排序 /*直接插入排序的基本思想是: *顺序地把待排序序列中的各个记录按其关键字的大小,插入到已排序的序列的适当位置。 */ template<class T> void insertionSort( T a[], int n){ //将下标为1~n-1的元素逐个插入到已排序序列中适当的位置 for (int i = 1; i != n; i++){ //从a[i-1]开始向a[0]方向扫描各元素,寻找适当位置插入a[i] int j = i; T temp = a[i]; while (j > 0 && temp < a[j - 1]){ //逐个比较,直到temp>=a[j-1]时,j便是应插入的位置 //若达到j==0,则0是应插入的位置 a[j] = a[j - 1];//将元素逐个后移,以便找到插入位置使可立即插入 j--; } //插入位置已找到,立即插入 a[j] = temp; for (int i = 0; i != n; i++){//输出每步交换 cout << a[i] << " "; } cout << endl; } } //二、用选择法对数组a中元素进行升序排序 /* *选择排序的基本思想是: *不断从待排序的序列中选取关键字最小的记录放到已排序的记录序列的后面,直到序列中所有记录都已排序为止。 */ template<class T> void selectionSort(T a[], int n){ for (int i = 0; i != n - 1; i++){ int leastIndex = i;//最小元素的下标初值设为i //在元素a[i+1]....a[n-1]中逐个比较,显出最小值 for (int j = i + 1; j < n; j++){ if (a[j] < a[leastIndex])//smallIndex始终记录当前找到的最小值的下标 leastIndex = j; } mySwap(a[i], a[leastIndex]);//将这一趟找到的最小元素与a[i]交换 for (int i = 0; i != n; i++){//输出每步交换 cout << a[i] << " "; } cout << endl; } } //三、用起泡法对数组a中元素进行升序排序 /*起泡排序的基本思想是: *将待排序序列中第一个记录的关键字R1与第二个记录的关键字R2做比较, *如果R1>R2,则交换R1和R2的位置,否则不交换; *然后继续对当前序列中的第二个记录和第三个记录同样的处理,依此类推。 */ template<class T> void bubbleSort(T a[], int n){ int i = n - 1; //i是下一趟需参与排序交换的元素的最大下标 while (i > 0){ //继续排序过程,直到最后一趟排序没有交换发生,或已达n-1趟 int lastExchangeIndex = 0; //每一趟开始时,设置交换标志为0 for (int j = 0; j < i; j++){ //每一趟对元素a[0]....a[i]进行比较和交换 if (a[j + 1] < a[j]){ //如果元素a[j+1]<a[j],交换 mySwap(a[j], a[j + 1]); for (int x = 0; x != size; x++){ //输出每步交换 cout << a[x] << " "; } cout << endl; lastExchangeIndex = j; //记录被交换的的一对元素中较小的下标 } } i = lastExchangeIndex; //将i设置为本趟被交换的最后一对元素中较小的下标 } } //四、用希尔排序法对数组a中元素进行升序排序 /*希尔排序的基本思想是: *不断把待排序的记录分成若干个小组,对同一组内的记录进行排序, *在分组时,始终保证当前组内的记录个数超过前面分组排序时组内的记录个数。 */ template<class T> void shellSort(T a[], int n){ for (int i = 0; i != size; i++){ cout << a[i] << " "; } cout << endl; for (int i = n / 2; i > 0; i /= 2){ for (int j = i; j < n; j++){ int temp = a[j]; int k = 0; for (k = j; k >= i; k -= i){ if (temp < a[k - i]){ a[k] = a[k - i]; }else break; } a[k] = temp; for (int i = 0; i != size; i++){ cout << a[i] << " "; } cout << endl; } } } //五、用快速排序法对数组a中元素进行升序排序 /**该方法的基本思想是: 1.先从数列中取出一个数作为基准数。 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。 3.再对左右区间重复第二步,直到各区间只有一个数。 */ void quickSort(int s[], int l, int r) { if (l< r) { int i = l, j = r, x = s[l]; while (i < j) { while (i < j && s[j] >= x) // 从右向左找第一个小于x的数 j--; if (i < j) s[i++] = s[j]; while (i < j && s[i]< x) // 从左向右找第一个大于等于x的数 i++; if (i < j) s[j--] = s[i]; } s[i] = x; for (int i = 0; i != size; i++){ cout << s[i] << " "; } cout << endl; quickSort(s, l, i - 1); // 递归调用 quickSort(s, i + 1, r); } } int main(){ int a[10] = { 13, 3, 1, 5, 2, 421, 2, 4, 3, 15 }; int b[10] = { 13, 3, 1, 5, 2, 421, 2, 4, 3, 15 }; int c[10] = { 13, 3, 1, 5, 2, 421, 2, 4, 3, 15 }; int d[10] = { 13, 3, 1, 5, 2, 421, 2, 4, 3, 15 }; int e[10] = { 13, 3, 1, 5, 2, 421, 2, 4, 3, 15 }; cout << endl; for (int i = 0; i != size; i++){ cout << a[i] << " "; } cout << endl; cout << "*********直接插入排序法************" << endl; insertionSort(a, size); cout << "*******直接插入排序法结束**********" << endl; cout << endl; for (int i = 0; i != size; i++){ cout << b[i] << " "; } cout << endl; cout << "*********选择排序法************" << endl; selectionSort(b, size); cout << "*******选择排序法结束**********" << endl; cout << endl; for (int i = 0; i != size; i++){ cout << c[i] << " "; } cout << endl; cout << "*********起泡排序法************" << endl; bubbleSort(c, size); cout << "*******起泡排序法结束**********" << endl; cout << endl; for (int i = 0; i != size; i++){ cout << d[i] << " "; } cout << endl; cout << "*********希尔排序法************" << endl; shellSort(d, size); cout << "*******希尔排序法结束**********" << endl; cout << endl; for (int i = 0; i != size; i++){ cout << d[i] << " "; } cout << endl; cout << "*********快速排序法************" << endl; quickSort(e, 0,size-1); cout << "*******快速排序法结束**********" << endl; for (int i = 0; i != size; i++){ cout << e[i] << " "; } cout << endl; }