七种基本的排序算法
冒泡排序
void BubbleSort(int* h, size_t len)
{
if (h == NULL) return;
if (len <= 1) return;
for (int i = 0; i < len - 1; ++i)
{
for (int j = 0; j < len - 1 - i; ++j)
{
if (h[j] > h[j + 1])
swap(h[j], h[j + 1]);
}
}
return;
}
选择排序
void SelectionSort(int* h, size_t len)
{
if (h == NULL) return;
if (len <= 1) return;
int minindex, i, j;
for (i = 0; i < len; i++)
{
minindex = i;
for (j = i + 1; j < len; j++)
{
if (h[j] < h[minindex]) minindex = j;
}
swap(h[i], h[minindex]);
}
return;
}
插入排序
void InsertSort(int* h, size_t len)
{
if (h == NULL) return;
if (len <= 1) return;
int i, j;
for (int i = 1; i < len; i++)
{
for (int j = i; j > 0; j--)
{
if (h[j] < h[j - 1]) swap(h[j], h[j - 1]);
else break;
}
}
return;
}
快速排序
```
void QuickSort(int* h, int left, int right)
{
if (h == NULL) return;
if (left >= right) return;
srand((unsigned)time(NULL));
int len = right - left + 1;
int kindex = rand() % len + left;
swap(h[left], h[kindex]);
int key = h[left], i = left, j = right;
while (i < j)
{
while (h[j] >= key && i < j) --j;
if (i < j) h[i] = h[j];
while (h[i] < key && i < j) ++i;
if (i < j) h[j] = h[i];
}
h[i] = key;
QuickSort(h, left, i - 1);
QuickSort(h, j + 1, right);
}
归并排序
void MergeArray(int* arr, size_t left, size_t mid, size_t right, int* temp)
{
if (arr == NULL) return;
size_t i = left, j = mid + 1, k = 0;
while (i <= mid && j <= right)
{
if (arr[i] <= arr[j])
{
temp[k++] = arr[i++];
continue;
}
temp[k++] = arr[j++];
}
while (i <= mid)
temp[k++] = arr[i++];
while (j <= right)
temp[k++] = arr[j++];
memcpy(&arr[left], temp, k * sizeof(int));
return;
}
void MMergeSort(int* arr, size_t left, size_t right, int* temp)
{
if (left < right)
{
size_t mid = (left + right) / 2;
MMergeSort(arr, left, mid, temp);
MMergeSort(arr, mid + 1, right, temp);
MergeArray(arr, left, mid, right, temp);
}
}
void MergeSort(int* h, size_t len)
{
if (h == NULL) return;
if (len <= 1) return;
int* temp = (int*)calloc(len, sizeof(int));
MMergeSort(h, 0, len - 1, temp);
memcpy(h, temp, sizeof(int) * len);
free(temp);
return;
}
堆排序
void AdjustHeap(int* h, int node, int len)
{
int index = node;
int child = 2 * index + 1;
while (child < len)
{
if (child + 1 < len && h[child] < h[child + 1])
{
child++;
}
if (h[index] >= h[child]) break;
swap(h[index], h[child]);
index = child;
child = 2 * index + 1;
}
}
void MakeHeap(int* h, int len)
{
for (int i = len / 2; i >= 0; --i)
{
AdjustHeap(h, i, len);
}
}
void HeapSort(int* h, int len)
{
MakeHeap(h, len);
for (int i = len - 1; i >= 0; i--)
{
swap(h[i], h[0]);
AdjustHeap(h, 0, i);
}
}
希尔排序
void ShellSort(int* h, size_t len)
{
if (h == NULL) return;
if (len <= 1) return;
for (int div = len / 2; div >= 1; div /= 2)
{
for (int k = 0; k < div; k++)
{
for (int i = div + k; i < len; i += div)
{
for (int j = i; j > k; j -= div)
{
if (h[j] < h[j - div]) swap(h[j], h[j - div]);
else break;
}
}
}
}
}
代码转自->www.cnblogs.com/fnlingnzb-l…