数据结构排序1-冒泡,选择,插入排序

本文深入探讨了三种基本排序算法——冒泡排序、选择排序和插入排序的实现与优化。通过C++代码详细展示了每种算法的工作原理,包括冒泡排序的不同版本、选择排序的改进以及插入排序的过程。此外,还提供了算法运行时间的测量方法。

冒泡排序 ,选择排序,插入排序

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<random>
#include<time.h>
#include<sys/timeb.h>
using namespace std;
#define MAX 10

long getSystemTime()
{
	struct timeb tb;
	ftime(&tb);
	return tb.time * 1000 + tb.millitm;  //毫秒
}

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

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

//从小到大排序
void bubbleSort1(int arr[], int length)
{
	for (int i = 0; i < length; i++)   //从前到后排序
	{
		for (int j = 0; j < length - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				Swapp(&arr[j], &arr[j + 1]);
			}
		}
	}
}
//从小到大排序
void bubbleSort2(int arr[], int length)
{
	for (int i = 0; i < length; i++)   //从后往前排序
	{
		for (int j = length - 1; j > i; j--)
		{
			if (arr[j] < arr[j - 1])
			{
				Swapp(&arr[j], &arr[j - 1]);
			}
		}
	}
}

//冒泡排序2改进版
int flag = 0;  //0表示没有排序好
void BubbleSort(int arr[], int length)
{
	for (int i = 0; i < length&&flag==0; i++)   //从后往前排序
	{
		flag = 1;  //认为已经排序好
		for (int j = length - 1; j > i; j--)
		{
			if (arr[j] < arr[j - 1])
			{
				flag = 0;
				Swapp(&arr[j], &arr[j - 1]);
			}
		}
	}
}


//从小到大排序
void selectSortme(int arr[], int length)
{	
	for (int i = 0; i < length; i++)   //从前到后排序
	{
		//for (int j = i+1; j < length-i-1; j++)//这里j初始值在一直增加,所以长度为length
		for (int j = i + 1; j < length; j++)
		{
			if (arr[j] <= arr[i])
			{
				Swapp(&arr[i], &arr[j]);
			}
		}
		
		printf("////////////////////");
		printArr(arr, MAX);
		
	}
}
void selectSort(int arr[], int length)
{
	for (int i = 0; i < length; i++)   //从前到后排序
	{
		int min = i;
		for (int j = i + 1; j < length; j++)
		{
			if (arr[j] < arr[min])
			{
				min = j;
			}
		}
		//Swapp(&arr[min], &arr[i]); 交换次数多
		if (min != i)  //交换次数少
		{
			Swapp(&arr[min], &arr[i]);
		}
	}
}


void insertSort(int arr[], int length)   //如何定义新数组???
{
	int j;
	for (int i = 1; i < length; i++)  //从第二个数开始是无序队列。第一个数为有序队列
	{
		if (arr[i]<arr[i-1])
		{
			int temp = arr[i];  //将满足条件的元素缓冲到temp中
			for (j = i-1; j >=0 && temp < arr[j]; j--)  //将前面的移到后面,方便插入
			{
				arr[j + 1] = arr[j];
			}
			arr[j + 1] = temp;  //填补坑
		}
	}
}

int main()
{
	int arr[MAX];
	srand((unsigned int)time(NULL));  //种子
	for (int i = 0; i < MAX; i++)
	{
		arr[i] = rand() % MAX;
	}
	printf("未排序数组为:");
	printArr(arr, MAX);
	long t_start = getSystemTime();
	insertSort(arr, MAX);
	long t_end = getSystemTime();
	printf("冒泡排序后数组为:");
	printArr(arr, MAX);
	//printf("冒泡排序%d个元素,所需时间:%1d\n", MAX, t_end - t_start);
	system("pause");
	return 0;
}

 

插入排序过程:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chde2Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值