所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序。这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率。对于排序,我们首先要求其具有一定的稳定性,即当两个相同的元素同时出现于某个序列之中,则经过一定的排序算法之后,两者在排序前后的相对位置不发生变化。
排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。
排序就是把集合中的元素按照一定的次序排序在一起。一般来说有升序排列和降序排列2种排序,在算法中有8中基本排序:
(1)冒泡排序;
(2)选择排序;
(3)插入排序;
(4)希尔排序;
(5)归并排序;
(6)快速排序;
(7)基数排序;
(8)堆排序;
(9)计数排序;
(10)桶排序。
排序算法的复杂度及稳定性分析
#include <stdio.h>
void sim_sort(int *a, int len) // 简单选择排序
{
for (int i = 0; i < len - 1; i++)
{
int p = i;
for (int j = i + 1; j < len; j++)
{
if (*(a + p) > *(a + j))
{
p = j;
}
}
if (i != p)
{
int t = *(a + i);
*(a + i) = *(a + p);
*(a + p) = t;
}
}
}
void in_sort(int *a, int len) // 直接插入排序
{
for (int i = 1; i < len; i++)
{
int p = i;
int t = *(a + i);
while (p > 0)
{
if (t < *(a + p - 1))
{
*(a + p) = *(a + p - 1);
}
else
{
*(a + p) = t;
break;
}
p--;
}
if (p == 0)
{
*a = t;
}
}
}
void quick_sort(int *a, int low, int high) // 快速排序
{
int k = a[low], l = low, h = high;
while (low < high)
{
while (low < high && k <= a[high])
{
high--;
}
a[low] = a[high];
while (low < high && k >= a[low])
{
low++;
}
a[high] = a[low];
}
int m;
if (low == high)
{
a[low] = k;
m = low;
}
if (l < m - 1)
{
quick_sort(a, l, m - 1);
}
if (m + 1 < h)
{
quick_sort(a, m + 1, h);
}
}
void merger(int *a, int low, int high) // 归并排序{二路}
{
if (low >= high)
{
return;
}
int mid = (high + low) / 2;
merger(a, low, mid);
merger(a, mid + 1, high);
int b[high - low + 1];
int i = 0;
int l = low, h = high, m = mid;
while (l <= mid && m + 1 <= high)
{
if (a[l] <= a[m + 1] && l <= mid)
{
b[i++] = a[l++];
}
else if (a[l] > a[m + 1] && m + 1 <= high)
{
b[i++] = a[m + 1];
m++;
}
}
while (l <= mid)
{
b[i++] = a[l++];
}
while (m + 1 <= high)
{
b[i++] = a[m + 1];
m++;
}
l = low;
for (int j = 0; j < high - low + 1; j++)
{
a[l++] = b[j];
}
}
void output(int *a, int len) // 输出
{
for (int i = 0; i < len; i++)
{
printf("%d\t", a[i]);
}
puts("");
printf("有%d个元素\n", len);
}
int half_search(int *a, int e, int low, int high) // 折半查找{需要在有序表里查找}
{
int mid = (low + high) / 2;
if (low <= high)
{
if (e < a[mid])
{
half_search(a, e, low, mid - 1);
}
else if (e > a[mid])
{
half_search(a, e, mid + 1, high);
}
else if (e = a[mid])
{
printf(" %d 在第 %d 个位置出现。\n", e, mid + 1);
return mid;
}
}
else
{
printf(" %d 未在表内出现。\n", e);
return -1;
}
}
void main()
{
int a[] = {2, 37, 12, 13, 34, 7};
int len = sizeof(a) / sizeof(a[0]);
output(a, len);
int high = len - 1;
int low = 0;
// quick_sort(a,low,high); //快速排序
merger(a, low, high); // 归并排序
// in_sort(a,len); //插入排序
// sim_sort(a,len); //选择排序
output(a, len);
int e;
printf("输入你要查找的元素:");
scanf("%d", &e);
int p = half_search(a, e, low, high);
}