数据结构-排序-冒泡排序-快速排序-插入排序-堆排序

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>

void swap(int *a, int *b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}


void show(int *arr,int sum)
{
	for (int i = 0; i < sum; i++)
		printf("%d,", arr[i]);
	printf("\n");
}


void maopao(int *arr,int sum)//冒泡排序
{
	for(int i=0;i<sum;i++)
		//for (int j = 0; j < sum - 1 - i; j++) //往后冒
		//{
		//	if (*(arr+j) > *(arr+j+1))
		//		swap((arr + j), (arr + j+1));
		//}

		for (int j = sum - 1 ; j > i; j--) //往前冒
		{
			if (*(arr+j) < *(arr+j-1))
				swap((arr + j), (arr + j - 1));
		}

	printf("\n");
}

void maopaoA(int *arr, int sum)//冒泡排序改进,增加一个标识
{
	int flag=1;
	for (int i = 0; i<sum&&flag; i++)
	{ 
		flag = 0;
		for (int j = sum - 1; j > i; j--) //往前冒
		{
			if (*(arr + j) < *(arr + j - 1))//如果没有任何数据交换,可以结束循环。
			{
				swap((arr + j), (arr + j - 1));
				flag = 1;
			}
		}	
	}
	printf("\n");
}


//简单选择排序
void simpleSelectSort(int *arr,int sum)
{
	int min=0;//记录i次最小数的坐标
	for (int i = 0; i < sum; i++)
	{
		min = i;
		for (int j = i+1; j < sum; j++)
		{
			if (arr[j] < arr[min])
			{
				min = j;
			}		
		}
		swap(arr + i, arr + min);
	}
}

//直接插入排序
void insertSort(int *arr, int sum)//插入排序像整理扑克牌,抓一张插入一张
{
	// = { 88,5,6,89,7,8,22,9,32,6 };
	int f1,f2,i,j;
	for ( i = 1; i < sum; i++)
	{
		if (arr[i-1] > arr[i])
		{
			f1 = arr[i+1];//记录下一个,因为要往后移动
			f2 = arr[i];//设置哨兵(也就事当前摸到的牌)
			for (j = i;j>-1 ; j--)//记录往后移
			{
				arr[j+1] = arr[j];	
				if (arr[j] < f2)
					break;
			}
			arr[j+1] = f2;//插入当前摸到的扑克牌
			arr[i+1] = f1;
			//show(arr,10);
		}
	}
}


void quicksort(int *arr,int left,int right)//快速排序又称双冒泡
{
	if (left > right)
		return;

	int lefti = left;
	int rightj = right;
	//思路:从左往右找最小,从右往左找最大
	for (lefti = left; lefti < right; lefti++)
	{
		if (arr[left] > arr[lefti])
			swap(arr + left, arr + lefti);
	}
	for (rightj = right; rightj > left; rightj--)
	{
		if (arr[right] < arr[rightj])
			swap(arr + right, arr + rightj);
	}
	left++;
	quicksort(arr, left++, right);
	right--;
	quicksort(arr, left, right++);
}

//堆排序
void adjustHeap(int * arr,int lens,int lenm)//大顶堆,lenm数组长度,lens=lenm/2  //adjust调整堆
{
	int temp = arr[lens];//保存根节点
	for (int i = ((lens) * 2)+1; i < lenm; i = i * 2)
	{
		if (i<lenm-1&&arr[i]<arr[i+1])//(确保arr[i]为3个树中最大)右子树比较大,记录右子树
			i++;//
		if (arr[i] < temp)//如果比根小,跳出循环
			break;
		arr[lens] = arr[i];//将arr[i]赋值给根
		lens = i;	//从i开始再循环,这时候根为下标i的元素****
	}
	arr[lens] = temp;//循环完后的根为temp
	//show(arr, 10);
}

void adjustHeapsmall(int * arr, int lens, int lenm)//小顶堆,lenm数组长度,lens=lenm/2  //adjust调整堆
{
	int temp = arr[lens];//保存根节点
	for (int i = ((lens) * 2) + 1; i < lenm; i = i * 2)
	{
		if (i<lenm - 1 && arr[i]>arr[i + 1])//(确保arr[i]为3个树中最小)右子树比较小,记录右子树
			i++;//
		if (arr[i] > temp)//如果比根小,跳出循环
			break;
		arr[lens] = arr[i];//将arr[i]赋值给根
		lens = i;	//从i开始再循环,这时候根为下标i的元素
	}
	arr[lens] = temp;//循环完后的根为temp
					 //show(arr, 10);
}

void createHeap(int * arr, int sum)
{
	for (int i = (sum / 2)-1; i >-1; i--)//(sum / 2)-1和i >-1是因为数组下标从0开始
		adjustHeapsmall(arr, i, sum);//调整堆,找出最大的在arr[0]
}

void heapSort(int * arr,int sum) 
{
	//堆排序采用二叉树,查找极值放在左边
	for (int i = 0; i < sum; i++)
	{
		createHeap(arr + i, sum - i);
	}
}




void main()
{
	int arr[10] = { 5,88,6,89,7,8,22,9,32,6 };
	show(arr, 10);

	//maopaoA(arr,10);
	//printf("冒泡排序:");
	//show(arr, 10);

	//simpleSelectSort(arr, 10);
	//printf("简单选择排序:");
	//show(arr, 10);

	//insertSort(arr, 10);
	//printf("插入排序:");
	//show(arr, 10);

	/*printf("快速(双冒泡)排序:");
	quicksort(arr, 0, 9);
	show(arr, 10);*/

	heapSort(arr,10);
	printf("堆排序:");
	show(arr,10);
	system("pause");
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值