不想废话,直接上代码,代码都是调试过的。
实现的算法有:冒泡,直接选择,直接插入,归并,二叉堆,快速排序这六种。
对于后三种的理解方法,请百度这个系列的文章“白话经典算法系列 ”,个人感觉作者讲的特别不错!
下面贴代码
#include <stdio.h>
#include <conio.h>
//冒泡排序
void BubbleSort(int arry[], int n)
{
int i, j, k;
for (i = 0; i < n; i++)
{
k = 0;
for (j = 0; j < n - 1; j++)
{
if (arry[j] > arry[j + 1])
{
int t = arry[j];
arry[j] = arry[j+1];
arry[j+1] = t;
k = 1;
}
}
if (k == 0)
break;
}
}
//插入排序
void InsertSort(int arry[], int n)
{
//{ 9,23,1,8,5,13,7,12,0,4 };
int i, j, k;
for (i = 1; i < n; i++)
{
k = arry[i];
for (j = i - 1; j >= 0&& arry[j] >=k; j--)
{
arry[j + 1] = arry[j];
}
arry[j + 1] = k;
}
}
//选择排序
void SelectSort(int arry[], int n)
{
int i, j, k;
for (int i = 0; i < n; i++)
{
k = i;
for (j = i+1; j < n; j++)
{
if (arry[k]> arry[j])
{
k = j;
}
}
int t = arry[i];
arry[i] = arry[k];
arry[k] = t;
}
}
//堆排序
//最小堆向上向下排列函数
void MakeMinHeapUp(int arry[], int i)
{
int j = (i - 1) / 2;
int temp = arry[i];
while (j >= 0)
{
if (arry[j] < arry[i])
break;
arry[i] = arry[j];
i = j;
j = (j - 1) / 2;
}
arry[i] = j;
}
void MakeMinHeapDown(int arry[],int n,int i)
{
int j = i * 2 + 1;
int temp = arry[i];
while (j < n)
{
if (j+1<n&&arry[j + 1] < arry[j])
j++;
if (arry[i] < arry[j])
break;
arry[i] = arry[j];
i = j;
j = 2 * j + 1;
}
arry[i] = temp;
}
//最大堆向上向下排列函数
void MakeMaxHeapUp(int arry[], int i)
{
int j = (i - 1) / 2;
int temp = arry[i];
while (j >= 0)
{
if (arry[j] > arry[i])
break;
arry[i] = arry[j];
i = j;
j = (j - 1) / 2;
}
arry[i] = j;
}
void MakeMaxHeapDown(int arry[], int n, int i)
{
int j = i * 2 + 1;
int temp = arry[i];
while (j < n)
{
if (j + 1<n&&arry[j + 1] > arry[j])
j++;
if (arry[i] > arry[j])
break;
arry[i] = arry[j];
i = j;
j = 2 * j + 1;
}
arry[i] = temp;
}
//生成最小堆,排序后为降序
void MakeMinHeap(int arry[], int n)
{
for (int i = n / 2 - 1; i >= 0; i--)
{
MakeMinHeapDown(arry, n, i);
}
}
//生成最大堆,排序后为升序
void MakeMaxHeap(int arry[], int n)
{
for (int i = n / 2 - 1; i >= 0; i--)
{
MakeMaxHeapDown(arry, n, i);
}
}
void HeapSortMain(int arry[], int n)
{
int temp;
for (int i = n - 1; i >= 1; i--)
{
temp = arry[i];
arry[i] = arry[0];
arry[0] = temp;
//MakeMinHeap(arry, i);
MakeMaxHeap(arry, i);
}
}
void HeapSort(int arry[],int n)
{
//MakeMinHeap(arry, n);
MakeMaxHeap(arry, n);
HeapSortMain(arry, n);
}
//快速排序
int GetIndex(int arry[], int l, int r)
{
int i = l, j = r;
int k = arry[l];
while (i < j)
{
while (i<j&&k<arry[j])
{
j--;
}
if (i < j)
{
arry[i] = arry[j];
i++;
}
while (i<j&&k>arry[i])
{
i++;
}
if (i < j)
{
arry[j] = arry[i];
j--;
}
}
arry[i] = k;
return i;
}
void QuickSortMain(int arry[], int l, int r)
{
if (l < r)
{
int mid = GetIndex(arry, l, r);
QuickSortMain(arry, l, mid-1);
QuickSortMain(arry, mid + 1, r);
}
}
void QuickSort(int arry[], int n)
{
QuickSortMain(arry, 0, n - 1);
}
//归并排序
void MergeArry(int arry[], int first, int mid, int last, int temp[])
{
int i = first, j = mid + 1;
int k = 0;
while (i <= mid&&j <= last)
{
if (arry[i]>arry[j])
{
temp[k++] = arry[j++];
}
else
{
temp[k++] = arry[i++];
}
}
while (i <= mid)
{
temp[k++] = arry[i++];
}
while (j <= last)
{
temp[k++] = arry[j++];
}
for (i = 0; i < k; i++)
{
arry[first + i] = temp[i];
}
}
void MergeSortMain(int arry[],int first,int last,int temp[])
{
if (first < last)
{
int mid = (first + last) / 2;
MergeSortMain(arry, first, mid,temp);
MergeSortMain(arry, mid + 1, last,temp);
MergeArry(arry, first, mid, last, temp);
}
}
void MergeSort(int arry[],int n)
{
int *p = new int[n];
if (p == NULL)
{
return;
}
MergeSortMain(arry, 0, n - 1, p);
delete[] p;
}
int main()
{
//int arry[10] = { 9,8,7,6,5,4,3,2,1,0 };
int arry[10] = { 9,23,1,8,5,13,7,12,0,4 };
//BubbleSort(arry, 10);
//InsertSort(arry, 10);
//SelectSort(arry, 10);
//ShellSort(arry, 10);
//QuickSort(arry, 10);
//MergeSort(arry, 10);
//HeapSort(arry, 10);
int i = 0;
for (; i < 10; i++)
{
printf("%d ", *(arry + i));
}
getch();
}