几种排序(C语言)

/* 1.冒泡排序 */
void bubblesort(int ar[], int len)
/* 1.1 冒泡排序改进版 */
void bubblesort1(int ar[], int len)
/* 2.选择排序 */
void selectsort(int ar[], int len)
/* 3,插入排序 */
void insertsort(int ar[], int len)
/* 4.希尔排序 */
void shellsort(int ar[], int len)
/* 5.归并排序 */
void merge(int ar[], int l, int mid, int r)
void mergesort(int ar[], int l, int r)
void Merge(int ar[], int len)
/* 6.快速排序 */
void quicksort(int ar[], int begin, int end)

// demo1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<stdlib.h>

/* 打印数组 */
void printar(int ar[], int len)
{
	int i;

	for (i = 0; i < len; i++)
		printf("%d ", ar[i]);

	printf("\n");
}

/* 交换元素 */
void swap(int *a, int *b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

/* 1.冒泡排序 */
void bubblesort(int ar[], int len)
{
	int i, j;

	for (i = 0; i < len - 1; i++)
	{
		for (j = 0; j < len - 1 - i; j++)
		{
			if (ar[j] > ar[j + 1])
				swap(&ar[j], &ar[j+1]);
		}
	}
}

/* 1.1 冒泡排序改进版 */
void bubblesort1(int ar[], int len)
{
	int i, flag;

	do {
		flag = 0;
		for (i = 0; i < len - 1; i++)
		{
			if (ar[i] > ar[i+1])
			{
				swap(&ar[i], &ar[i+1]);
				flag = 1;
			}
		}
		len--;
	} while (flag);
}

/* 2.选择排序 */
void selectsort(int ar[], int len)
{
	int i, j, minidx;

	for (i = 0; i < len - 1; i++)
	{
		minidx = i;
		for (j = i + 1; j < len; j++)
		{
			if (ar[j] < ar[minidx])
				minidx = j;
		}
		swap(&ar[i], &ar[minidx]);
	}
}

/* 3,插入排序 */
void insertsort(int ar[], int len)
{
	int i, j;

	for (i = 1; i < len; i++)
	{
		j = i;
		while (j > 0 && ar[j] < ar[j-1])
		{
			swap(&ar[j-1], &ar[j]);
			j--;
		}
	}
}

/* 4.希尔排序 */
void shellsort(int ar[], int len)
{
	int gap, i, j, tmp;

	for (gap = len / 2; gap > 0; gap /= 2)
	{
		for (i = gap; i < len; i++)
		{
			j = i;
			while (j - gap >= 0 && ar[j] < ar[j-gap] )
			{
				swap(&ar[j-gap], &ar[j]);
				j = j - gap;
			}
		}
	}
}

/* 5.归并排序 */
void merge(int ar[], int l, int mid, int r)
{
	int len, i, pl, pr;
	int *tmp = NULL;

	len = r - l + 1;
	tmp = (int*)malloc(len * sizeof(int));  //申请存放完整序列内存
	memset(tmp, 0x0, len * sizeof(int));

	pl = l;
	pr = mid + 1;
	i = 0;

	while (pl <= mid && pr <= r)
	{
		if (ar[pl] < ar[pr])
			tmp[i++] = ar[pl++];
		else
			tmp[i++] = ar[pr++];
	}

	while (pl <= mid)
		tmp[i++] = ar[pl++];

	while (pr <= r)
		tmp[i++] = ar[pr++];

	for (i = 0; i < len; i++)
		ar[l + i] = tmp[i];

	free(tmp);
}

void mergesort(int ar[], int l, int r)
{
	if (l >= r)
		return;

	int mid = (l + r) / 2;
	mergesort(ar, l, mid);
	mergesort(ar, mid + 1, r);
	merge(ar, l, mid, r);
}

void Merge(int ar[], int len)
{
	int l = 0;
	int r = len - 1;

	mergesort(ar, l, r);
}
/* 6.快速排序 */
void quicksort(int ar[], int begin, int end)
{
	int l, r, tmp;

	if (begin < end)
	{
		l = begin + 1;
		r = end;

		while (l < r)
		{
			if (ar[l] > ar[begin])
				swap(&ar[l], &ar[r--]);
			else
				l++;
		}

		if (ar[l] >= ar[begin])
			l--;

		swap(&ar[l], &ar[begin]);
		quicksort(ar, begin, l);
		quicksort(ar, r, end);
	}
}




int main()
{
	int arr[10] = {8,2,7,6,9,3,5,4,1,0};

	int len = sizeof(arr) / sizeof(int);

	printar(arr, len);

	//bubblesort(arr, len);
	//bubblesort1(arr, len);
	//selectsort(arr, len);
	//insertsort(arr, len);
	//shellsort(arr, len);
	//Merge(arr, len);
	quicksort(arr, 0, len-1);

	printar(arr, len);

    return 0;
}

时间复杂度如下:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值