您的位置:首页 > 编程语言 > C语言/C++

【算法】插入排序、冒泡排序、选择排序、归并排序 C语言实现

2019-04-11 11:26 459 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hello_ape/article/details/89206211

 简单算法就直接上代码了

  • 插入排序 
[code]
void
printval(int *a, int n)
{
for (int i = 0; i < n; ++i)
std::cout << a[i] << std::endl;
}

void
insertsort(int *a, int n)
{
for (int i = 1; i <= n - 1; i++){
int j = i - 1;
//val 表示待排序数据
int val = a[i];
for (; j >= 0; j--){
//如果待插入数据比当前值小
if (val < a[j]){
//将当前数据向后移动一位
a[j + 1] = a[j];
}
//否则说明待插入数据大于当前数值
else
break;
}
a[j+1] = val;
printval(a, n);
std::cout << "_________after one sort" << std::endl;
}
}
  • 冒泡排序
[code]void
myswap(int a[], int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}

void
bubblesort(int a[], int n)
{
if (a == NULL || n < 2)
return;
for (int end = n - 1; n > 0; n--){
for (int i = 0; i < end; i++){
if (a[i] > a[i + 1]){
myswap(a, i,i+1);
}
}
}
}
  • 选择排序
[code]void
selectsort(int a[], int n)
{
if (a == NULL || n < 2)
return;
for (int i = 0; i < n; i++){
int min = i;
for (int j = i + 1; j < n; j++)
min = a[min] < a[j] ? min : j;
myswap(a, i, min);
}
}
  • 归并排序
[code]void
mergesort(int a[], int n)
{
if (a == NULL || n < 2)
return;
mergesort(a, 0, n - 1);
}

void
mergesort(int a[], int l,int r)
{
if (a == NULL || (r-l+1) < 2)
return;
int mid = l + ((r-l)>>1);
mergesort(a, l, mid);
mergesort(a, mid+1, r);
merge(a, l,mid,r);
}

void
merge(int a[], int l,int m, int r)
{
//计算数组长度
int len = r - l + 1;
//分配辅助空间大小
int *temparry = (int *)malloc(sizeof(int)*len);
int i = l;
int j = m+1;
//辅助空间数组的下标
int index = 0;
while (i <= m && j <= r){
temparry[index++] = a[i] < a[j] ? a[i++] : a[j++];
}
//拷贝剩余部分
while (i <= m){
temparry[index++] = a[i++];
}
while (j<=r)
temparry[index++] = a[j++];
//将辅助数组内容拷贝至原数组
for (int i = 0; i < len; i++)
a[l + i] = temparry[i];
delete temparry;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐