找工作前,先把各种排序算法整理一下。
#include<iostream>
using namespace std;
//partion;时间复杂度O(n)
int Partition(int r[], int first, int end)
{
int i = first, j = end, temp;
while (i < j)
{
while (i < j&&r[i] < r[j])
j--;
if (i < j)
{
temp = r[i];
r[i] = r[j];
r[j] = temp;
i++;
}
while (i < j&&r[i] < r[j])
i++;
if (i < j)
{
temp = r[j];
r[j] = r[i];
r[i] = temp;
j--;
}
}
return i;
}
//快速排序
void Quicksort(int r[], int first, int end)
{
if (first < end)
{
int pivot = Partition(r, first, end);
Quicksort(r, first, pivot - 1);
Quicksort(r, pivot + 1, end);
}
}
//冒泡排序
void BubbleSort1(int r[], int n)
{
int i, j, temp;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - i - 1; j++)
{
if (r[j] > r[j + 1])
{
temp = r[j];
r[j] = r[j + 1];
r[j + 1] = temp;
}
}
}
for (int i = 0; i < 18; i++)
cout << r[i] << '\t';
cout << endl;
}
void BubbleSort2(int r[], int n)
{
int exchange = n - 1;
int bound;
while (exchange)
{
bound = exchange;
exchange = 0;
for (int i = 0; i < bound; i++)
{
if (r[i] > r[i + 1])
{
int temp = r[i];
r[i] = r[i + 1];
r[i + 1] = temp;
exchange = i;
}
}
}
for (int i = 0; i < 18; i++)
cout << r[i] << '\t';
cout << endl;
}
//简单选择排序
void Selectsort(int r[], int n)
{
int i,j,index,temp;
for (i = 0; i < n - 1; i++)//进行n-1趟
{
index = i;
for (j = i + 1; j < n; j++)//在无序区选择最小的
{
if (r[j] < r[index])
index = j;
}
if (index != i)
{
temp = r[index];
r[index] = r[i];
r[i] = temp;
}
}
for (int i = 0; i < 18; i++)
cout << r[i] << '\t';
cout << endl;
}
//插入排序
void InsertSort(int r[], int n)
{
int j=0,temp;
for (int i = 1; i < n; i++)
{
if (r[i] < r[i - 1])
{
temp = r[i];
for (j = i - 1; j >= 0 && temp < r[j]; j--)
r[j + 1] = r[j];
r[j + 1] = temp;
}
}
for (int i = 0; i < 18; i++)
cout << r[i] << '\t';
cout << endl;
}
//希尔排序
void ShellSort(int r[], int n)
{
int increment = n, i, j, k,temp;
do
{
increment = increment / 3 + 1;
for (i = 0; i < increment; i++)
{
for (j = i + increment; j < n; j=j + increment)
{
if (r[j] < r[j - increment])
{
temp = r[j];
for (k = j - increment; k >= 0 && temp < r[k];k= k - increment)
r[j + increment] = r[j];
r[j + increment] = temp;
}
}
}
} while (increment > 1);
for (int i = 0; i < 18; i++)
cout << r[i] << '\t';
cout << endl;
}
//归并排序
void Merge(int r[], int r1[], int s, int m, int t)
{
int i = s;
int j = m + 1;
int k = s;
while (i <= m && j <= t)
{
if (r[i] <= r[j])
r1[k++] = r[i++];
else
r1[k++] = r[j++];
}
if (i <= m)
while (i <= m)
r1[k++] = r[i++];
else
while (j <= t)
r1[k++] = r[j++];
}
void MergeSort(int r[], int r1[], int s, int t)
{
int m;
if (s == t)
r1[s] = r[s];
else
{
m = (s + t) / 2;
MergeSort(r, r1, s, m);
MergeSort(r, r1, m + 1, t);
Merge(r, r1, s, m, t);
}
}
//测试用例
int main()
{
const int Max = 20;
int a[] = { 1,5,2,6,8,5,9,6,7,89,564,21,35,32,12,16,25,35 };
int a1[Max];
cout << "排序前数字分布:\n";
for (int i = 0; i < 18; i++)
cout << a[i] << '\t';
cout << endl;
cout << "冒泡排序1:\n";
BubbleSort1(a, 18);
cout << "冒泡排序2:\n";
BubbleSort2(a, 18);
cout << "插入排序:\n";
InsertSort(a, 18);
cout << "归并排序:\n";
MergeSort(a, a1, 0, 17);
for (int i = 0; i < 18; i++)
cout << a1[i] << '\t';
cout << endl;
cout << "快速排序:\n";
Quicksort(a, 0, 17);
for (int i = 0; i < 18; i++)
cout << a[i] << '\t';
cout << endl;
cout << "希尔排序:\n";
ShellSort(a, 18);
cout << "简单选择排序:\n";
Selectsort(a, 18);
system("pause");
return 0;
}