冒泡排序、选择排序、插入排序、希尔排序、快速排序、基数排序

来源:互联网 发布:php mysql apache 编辑:程序博客网 时间:2024/05/16 13:02
#include<iostream>using namespace std;void BubbleSort(int *a, int n){int flag = 1;   //添加标志位for (int i = 1; i < n && flag == 1; i++){flag = 0;for (int j = 0; j < n - i; j++){if (a[j] > a[j + 1]){int temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;flag = 1;           //交换成功}}if (flag == 1){cout << "第" << i << "次排序的结果是:";for (int i = 0; i < n; i++){cout << a[i] << "  ";}}cout << endl;}}void selectSort(int a[], int n){int flag = 1; //添加标志位for (int i = 0; i < n - 1 && flag==1; i++){flag = 0;for (int j = i+1; j < n; j++){if (a[i] > a[j]){int temp = a[i];a[i] = a[j];a[j] = temp;flag = 1;   //交换成功}}if (flag == 1){cout << "第" << i+1 << "次排序的结果是:";for (int i = 0; i < n; i++){cout << a[i] << "  ";}}cout << endl;}}void insertSort(int *a, int n){int i;//扫描次数int j;//以j定位比较的元素for ( i = 1; i < n; i++){int temp;temp = a[i];j = i - 1;while (j >= 0 && a[j] > temp ){a[j + 1] = a[j];j--;}a[j + 1] = temp;cout << "第" << i << "次排序的结果是:";for (int i = 0; i < n; i++){cout << a[i] << "  ";}cout << endl;}}void shellSort(int a[], int n){int i =1;//扫描次数int j;//以j定位比较的元素int k = 1;//打印次数int temp;int jmp;jmp = n / 2;while (jmp != 0){for ( i = jmp; i < n; i++){temp = a[i];j = i - jmp;while (temp < a[j] && j >= 0){a[j + jmp] = a[j];j = j - jmp;}a[j + jmp] = temp;}cout << "第" << k++ << "次排序:";for (int i = 0; i < n; i++){cout << a[i] << "  ";}cout << endl;/****容易忽略掉****/jmp = jmp / 2;  //控制循环次数}}void quickSort(int *a, int n, int left, int right){int i, j, t, temp;static int k = 1;if (left>right)return;temp = a[left]; //temp中存的就是基准数 i = left;j = right;while (i != j){//顺序很重要,要先从右边开始找 while (a[j] >= temp && i<j)j--;//再找左边的 while (a[i] <= temp && i<j)i++;//交换两个数在数组中的位置 if (i<j){t = a[i];a[i] = a[j];a[j] = t;}}//最终将基准数归位 a[left] = a[i];a[i] = temp;cout << "第" <<k++ << "次排序:";for (int i = 0; i < n; i++){cout << a[i] << "  ";}cout << endl;quickSort(a, n, left, i - 1);//继续处理左边的,这里是一个递归的过程 quickSort(a, n, i + 1, right);//继续处理右边的 ,这里是一个递归的过程 }void quicksort(int *a, int n, int left, int right){static int k = 1;if (left < right){int key = a[left];int low = left;int high = right;while (low < high){while (low < high && a[high] >= key){high--;}a[low] = a[high];while (low < high && a[low] <= key){low++;}a[high] = a[low];}a[low] = key;cout << "第" << k++ << "次排序:";for (int i = 0; i < n; i++){cout << a[i] << "  ";}cout << endl;quicksort(a, n, left, low - 1);quicksort(a, n, low + 1, right);}}void radixSort(int *a, int size)  //基数排序{for (int n = 1; n <= 100; n=n*10)  //n为基数,从个位数开始排序{int tmp[10][100] = { 0 };for (int i = 0; i < size; i++){int m = (a[i] / n) % 10;tmp[m][i] = a[i];}int k = 0;for (int i = 0; i < 10; i++){for (int j = 0; j < size; j++){if (tmp[i][j] != 0){a[k] = tmp[i][j];k++;}}}cout << "经过" << n << "位数排序后:";for (int i = 0; i < size; i++){cout << a[i] << "  ";}cout << endl;}}int main(){int a[6] = { 4, 6, 1, 8, 13, 18 };cout << "冒泡排序:" << endl;BubbleSort(a, 6);int b[6] = { 4, 6, 1, 8, 13, 18 };cout << "选择排序:" << endl;selectSort(b, 6);int c[6] = { 4, 6, 1, 8, 13, 18 };cout << "插入排序:" << endl;insertSort(c, 6);int d[6] = { 4, 6, 1, 8, 13, 18 };cout << "希尔排序:" << endl;shellSort(d, 6);int e[10] = { 41, 89, 92, 42, 70, 34, 9, 10, 90, 70 };cout << "快速排序:" << endl;quicksort(e, 10, 0, 9);int f[12] = { 26,95,7,34,60,168,171,259,372,45,88,133 };cout << "基数排序:" << endl;radixSort(f, 12);return 0;}

阅读全文
0 0
原创粉丝点击