【数据结构】---冒泡排序

 1、冒泡排序是一种交换排序,基本思想是两两比较相邻的关键字,如果反序就交换,直到没有反序为止。

      (1)最简单的冒泡排序,严格意义来说并不算冒泡排序,因为它不满足两两比较相邻元素,只是最简单的交换排序而已,   效率非常低。

      (2)正宗的冒泡排序,当i = 1时,j从表尾开始反向循环到头,逐个比较,将较小值交换到前面,直到找到最小值放到第一个位置。

      (3)优化后的冒泡排序,加入一个flag判断,能够避免在元素有序的情况下再进行无谓的判断,增加排序的效率。

         冒泡排序的时间复杂度为O(n^{2})

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

#define MAXSIZE 10

typedef struct 
{
	int data[MAXSIZE];
	int length;
}SqList;//表




void Insert(SqList *L)
{
	L->length = MAXSIZE;
	printf("请输入%d个数字:",L->length);
	for (int i = 0; i < L->length; i++)	
	{
		scanf_s("%d",&L->data[i]);
	}
}

void Out(SqList *L)
{
	int i;
	for (i = 0; i < MAXSIZE; i++)
	{
		printf("%d ", L->data[i]);
	}
	printf("\n");
}
void GuluGulu1(SqList &L)
{
	Insert(&L);
	printf("表中的元素:");
	Out(&L);
	int i, j;
	for (i = 0; i < L.length; i++)
	{
		for (j = i+1; j < L.length ; j++)
		{
			if (L.data[i] > L.data[j])
				swap(L.data[i],L.data[j]);
		}
	}
	printf("冒泡排序1后的结果:");
	Out(&L);
}

void Gulugulu2(SqList &L)
{
	Insert(&L);
	printf("表中的元素:");
	Out(&L);
	int i, j;
	for (i = 0;i < L.length; i++)
	{
		for (j = L.length - 1; j >= i; j--)
		{
			if (L.data[j] < L.data[j - 1])
				swap(L.data[j], L.data[j - 1]);
		}
	}
	printf("冒泡排序2后的结果:");
	Out(&L);
}

void GuluGulu3(SqList &L)
{
	Insert(&L);
	printf("表中的元素:");
	Out(&L);
	int i, j;
	int flag = 1;
	for (i = 0; i < L.length && flag == 1; i++)
	{
		flag = 0;//将flag置为0
		for (j = L.length - 1; j >= i ; j--)
		{
			if (L.data[j] < L.data[j - 1])
				swap(L.data[j], L.data[j - 1]);
				flag = 1;//发生数据交换就把flag置1
		}
	}
	printf("冒泡排序3后的结果:");
	Out(&L);
}

int main()
{
	SqList L;
	GuluGulu1(L);
	Gulugulu2(L);
	GuluGulu3(L);
}


猜你喜欢

转载自blog.csdn.net/weixin_40567229/article/details/81143813