#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)
{
for (int i = 0; i < n; i++)
{
int min = i;
for (int j = i + 1; j < n; j++)
{
if (a[j] < a[min])
min = j;
}
if (min != i)
{
swap(a[min], a[i]);
cout << "第" << i + 1 << "次排序的结果是:";
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
}
}
}
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 InsertSort2(int *array, int n)
{
int i, j, temp;
for (i = 1; i < n; i++)
{
temp = array[i];
for (j = i - 1; j >= 0 && temp < array[j]; j--)
{
array[j + 1] = array[j];
}
array[j + 1] = temp;
cout << "第" << i << "次排序的结果是:";
for (int i = 0; i < n; i++)
{
cout << array[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 ShellSort2(int *array, int n)
{
int k = n / 2; //增量序列(仅作举例)
int temp;
while (k > 0)
{
int i = 0, j = 0;
for (i = k; i < n; i++)
{
temp = array[i];
for (j = i - k; j >= 0 && temp < array[j]; j -= k)
{
array[j + k] = array[j];
}
array[j + k] = temp;
}
k = k / 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;
}
}
void radixSort2(vector<int> &arr)
{
vector<vector<int>> buckets(10);
int radix = 1;
for (int i = 0; i < 10; i++) //INT_MAX为10位数,所以最多进行10次入桶
{
for (int j = 0; j < arr.size(); j++)
{
buckets[(arr[j] / radix) % 10].push_back(arr[j]);
}
int k = 0;
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < buckets[i].size(); j++)
{
arr[k++] = buckets[i][j];
}
if (buckets[i].size() == arr.size())//全部在一个桶里了,提前结束
{
return;
}
buckets[i].clear();
}
radix *= 10;
}
}
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;
}