排序算法
- 直接插入排序
- 希尔排序
- 冒泡排序
- 快速排序
- 简单选择排序
- 堆排序
直接插入排序
void InsertSort(int r[], int n)
{
for (int i = 2; i < n; i++)
{
r[0] = r[i];
int j = i - 1;
while (r[0] < r[j])
{
r[j + 1] = r[j];
j--;
}
r[j + 1] = r[0];
}
}
希尔排序
void ShellSort(int r[], int n)
{
for (int d = n / 2; d >= 1; d = d / 2)
{
for (int i = d + 1; i <= n; i++)
{
r[0] = r[i]; int j = 0;
for (j = i - d; j > 0 && r[0] < r[j]; j = j - d)
{
r[j + d] = r[j];
}
r[j + d] = r[0];
}
}
}
冒泡排序
void BubbleSort(int r[], int n)
{
int exchange = n;
while (exchange != 0)
{
int bound = exchange; exchange = 0;
for (int j = 1; j < bound; j++)
{
if (r[j] > r[j + 1])
{
r[0] = r[j]; r[j] = r[j + 1]; r[j + 1] = r[0];
exchange = j;
}
}
}
}
快速排序
//划分
int Partition(int r[], int left, int right)
{
int i = left; int j = right;
while (i < j)
{
while (i < j && r[i] <= r[j])
{
j--;
}
if (i < j)
{
int temp = r[i]; r[i] = r[j]; r[j] = temp;
i++;
}
while (i < j && r[i] <= r[j])
{
i++;
}
if (i < j)
{
int temp = r[i]; r[i] = r[j]; r[j] = temp;
j--;
}
}
return i;
}
void QuickSort(int r[], int left, int right)
{
if (left < right)
{
int pivotpos = Partition(r, left, right);
QuickSort(r, left, pivotpos - 1);
QuickSort(r, pivotpos + 1, right);
}
}
简单选择排序
void SelectSort(int r[], int n)
{
for (int i = 1; i < n; i++)
{
int index = i;
for (int j = i + 1; j <= n; j++)
{
if (r[j] > r[index])
{
index = j;
}
}
if (index != i)
{
r[0] = r[i]; r[i] = r[index]; r[index] = r[0];
}
}
}
堆排序
//堆调整--大根堆
void Sift(int r[], int k, int n)
{
int i = k; int j = 2 * i;
while (j <= n)
{
if (j < n && r[j] < r[j + 1])
{
j++;
}
if (r[i] > r[j])
{
break;
}
else
{
int temp = r[i]; r[i] = r[j]; r[j] = temp;
i = j; j = 2 * i;
}
}
}
void HeapSort(int r[], int n)
{
for (int i = n / 2; i >= 1; i--)
{
Sift(r, i, n);
}
for (int i = 1; i < n; i++)
{
r[0] = r[1]; r[1] = r[n - i + 1]; r[n - i + 1] = r[0];
Sift(r, 1, n - i);
}
}