排序算法汇总
1.冒泡排序
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

void BubbleSort(int a[])
{
for (int i = 0; i<10; i++)
{
for (int j = 9; j > i; j--)
if (a[j] < a[j - 1])
swap(a[j], a[j - 1]);
}
}
2.选择排序
选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
void SelectSort(int a[])
{
int min,i,j;
for (i = 0; i < 9; i++)
{
min = i;
for (j = i + 1; j < 10; j++)
if (a[min] > a[j])
{
min = j;
}
if (min != i)
swap(a[min], a[i]);
}
}3.插入排序
插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

void InsertSort(int a[])
{
int i = 0, j = 0,t;
for (i = 1; i <10; i++)
{
if (a[i-1]>a[i])
{
t = a[i];
for (j = i-1;j>=0&&a[j]>t;j--)
a[j+1] = a[j];
a[j+1] = t;
}
}
}4.希尔排序
是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。

void ShellSort(int a[])
{
int i, j, t;
for (int dk= 5; dk >=1; dk=dk/2)
{
for (i = dk; i <10; i++)
{
if (a[i] < a[i - dk])
{
t= a[i];
for (j = i - dk; j >= 0 && t < a[j]; j=j-dk)
a[j+dk] = a[j];
a[j+dk] =t;
}
}
}
}5. 归并排序
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。


int n=10;
int *b = (int *)malloc((n + 1) * sizeof(int));//辅助数组B
void Merge(int a[],int low,int mid,int high)
{//表的两段a[low...high]和a[mid+1...high]各自有序,将他们合并成一个有序表
int i, j, k;
for (int k=low; k<=high;k++)
b[k] = a[k];
for (i = low,j = mid + 1, k = i; i <= mid && j <=high; k++)
{
if (b[i] < b[j])
a[k] = b[i++];
else a[k] = b[j++];
}
while (i<=mid) a[k++] = b[i++];//若第一个表未检测完,复制
while (j<=high) a[k++] = b[j++];//若第二个表未检测完,复制
}
void MergeSort(int a[],int low,int high)
{
if (low < high)
{
int mid = (low + high) / 2;
MergeSort(a, low, mid);
MergeSort(a, mid + 1, high);
Merge(a, low,mid, high);
}
}6.快速排序
快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

int Partition(int a[], int low, int high)
{
int pivot = a[low];
while (low < high)
{
while (low < high&&a[high] >= pivot) high--;
a[low] = a[high];//将比枢轴小的移动到左端
while (low < high&&a[low] <= pivot) low++;
a[high] = a[low];//将比枢轴大的移动到右端
}
a[low] = pivot;//枢轴元素存放到最终位置
return low;//返回存放枢轴的最终位置
}
void QuickSort(int a[], int low, int high)
{
if (low < high)
{
int pivotpos = Partition(a,low,high);//对其进行划分为两个子表的操作。
QuickSort(a, low, pivotpos-1);
QuickSort(a, pivotpos + 1, high);
}
}
7.堆排序
堆排序是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质

void HeadAdjust(int a[], int k, int len)
{
int i, j,t;
t = a[k];//a[0]暂存子树的根节点
for (i=2*k;i<=len;i=i*2)//沿key较大的子节点向下筛选
{
if (i < len&&a[i] < a[i + 1])i++;//取key较大的子节点的下标
if (t>= a[i])break;//筛选结束
else
{
a[k] = a[i];//将a[i]调整到双亲节点上
k = i;//修改k的值,以便继续向下筛选。
}
}
a[k] = t;//被筛选节点的值放在最终位置
}
void BuildMaxHeap(int a[],int len)
{
for (int i = len / 2; i >0; i--)
HeadAdjust(a, i, len);
}
void HeapSort(int a[],int len)
{
int i;
BuildMaxHeap(a, len);
for ( i = len; i >1; i--)
{
swap(a[i], a[1]);
HeadAdjust(a, 1, i-1);
}
}
版权声明:本文为qq_42239046原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。