数据结构考试复习

本文详细介绍了冒泡排序的步骤,通过实例演示了从一个无序数组到有序状态的过程。重点讲解了冒泡排序算法的工作原理,包括元素比较和交换操作,并展示了C、Python等语言的代码实现。同时,文中对比了冒泡排序与选择排序和插入排序的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

冒泡排序:
排序思路:
1.从第0个元素开始,每次用相邻的两个元素进行比较
2.一旦发现后面的一个元素小于我们前面的一个元素就交换位置
3.经过一轮冒泡排序比较之后最后一个元素就是最大值
4.排除最后一个元素,以此类推,每次比较完成后最大值都会出现在
被计较所有元素的最后一个位置,直到当前元素没有可比较的,冒泡
排序完成

冒泡排序:
3 7 4 2 6 1
冒泡

一趟冒泡排序

1.
[3 7] 4 2 6 1
因为3<7所以不用交换
3 7 4 2 6 1

2.
3 [7 4] 2 6 1
因为7>4
3 4 7 2 6 1

3.
3 4 [7 2] 6 1
因为7>2
3 4 2 7 6 1

4.
3 4 2 [7 6] 1
因为7>6
3 4 2 6 7 1

5.
3 4 2 6 [7 1]
因为7>1
3 4 2 6 1 7

二趟冒泡排序:
3 4 2 6 1		7
[3 4] 2 6 1		7
3 [4 2] 6 1		7
3 2 [4 6] 1		7
3 2 4 [6 1]		7
3 2 4 1 6		7

三趟排序冒泡排序:
3 2 4 1			6 7
[3 2] 4 1		6 7
2 [3 4] 1		6 7
2 3[4 1]		6 7
2 3 1		   4 6 7
四趟冒泡排序:
[2 3] 1		4 6 7
2 [3 1]		4 6 7
2 1 		3 4 6 7
五趟冒泡排序
1 2			3 4 6 7
作用:把当前待比较的数组中的最大值放到最后面

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

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void bubble(int arr[],int n)//函数里面按传递我们的数组和数组长度
{
	int i;
	int temp;
	for(i=0;i<n-1;i++)
	{
		//如果数组中前面的一个原素大于数组中后面的一个元素,就进行交换
		if(arr[i]>arr[i+1])
		{
			temp = arr[i];
			arr[i] = arr[i+1];
			arr[i+1] = temp;
		}
	}
}
// void bubbleSort(int arr[],int n)
// {
// 	bubble(arr,n);//经过冒泡排序之后,最大的树放到了最后面,此时只需要对数组的前n-1个数排序就可以了
// 	bubble(arr,n-1);
// 	bubble(arr,n-2);
// 	.....
// 	bubblr(arr,1);
// }
void bubbleSort(int arr[],int n)
{
	int i;
	for(i=n;i>=1;i--)
	{
		bubble(arr,i);
	}

}
int main(int argc, char *argv[]) {
	int arr[] = {3,2,4,1,6,7};
	int i;
	bubbleSort(arr,6);
	for(i=0;i<6;i++)
	{
		printf("%d\n",arr[i]);
	}

	return 0;
}
#########################################################################################
#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
	int a[6] = {3,2,4,1,6,7};//6个数的无序数列
	int i,j,t;
	for(i=0;i<6-1;i++)//6个数的数列总共需要扫描6-1次
	{
		for(j=0;j<6-i-1;j++)//每一趟扫描到a[n-i-2]与a[n-1-1]比较为止结束
		{
			if(a[j]>a[j+1])//前面一位数比后一位数大的话,就交换两个数的位置
			{
				t = a[j+1];
				a[j+1]=a[j];
				a[j]=t;
			}
		}
	}
	for(i=0;i<6;i++)
	{
		printf("%d ",a[i]);
	}
	return 0;
}
#######################################################################################

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

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void bubbleSort(int arr[],int n)
{
	int i,j,temp;
	for(i=0;i<n-1;i++)//控制比较的次数
	{
		for(j=0;j<n-1-i;j++)//控制每轮比较的次数
		{
			if(arr[j]>arr[j+1])//交换两个元素的条件
			{
				temp = arr[j];
				arr[j]= arr[j+1];
				arr[j+1] = temp;
			}
		}
	}
}
void pirnt(int arr[],int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		printf("%d\n",arr[i]);
	}
}
int main(int argc, char *argv[]) {
	int arr[6] = {3,4,2,6,1,7};
	bubbleSort(arr,6);
	pirnt(arr,6);
	return 0;
}


def bubble(arr,n):
    i = 0
    while i<n-1:
        # 如果数组中前面的一个原素大于数组中后面的一个元素,就进行交换
        if(arr[i]>arr[i+1]):
            temp = arr[i]
            arr[i] = arr[i+1]
            arr[i+1] = temp
        i += 1
# def bubbleSort(arr,n):
#     bubble(arr,n)
#//经过冒泡排序之后,最大的树放到了最后面,此时只需要对数组的前n-1个数排序就可以了
#     bubble(arr,n-1)
#     ....
#     bubble(arr,1)
def bubbleSort(arr,n):
    i = n
    while i>= 1:
        bubble(arr,i)
        i -= 1
arr = [3,2,4,1,6,7]
bubbleSort(arr,6)
for element in arr:
    print(element,end="\t")

###############################

# 六个数的无序数列
a = [3,2,4,1,6,7]
i = 0
while i < 6-1:#6个数的数列总共需要扫描6-1次
    j = 0
    while j < 6-i-1:# 每一趟扫描到a[n-i-2]与a[n-1-1]比较为止结束
        if a[j] > a[j+1]:#前面一位数比后一位数大的话,就交换两个数的位置
            t = a[j + 1]
            a[j + 1] = a[j]
            a[j] = t
        j += 1
    i += 1
for element in a:
    print(element,end="\t")
#########################

def bubblesort(a,n):
    i = 0
    while i < n - 1:  # 6个数的数列总共需要扫描6-1次
        j = 0
        while j < n - i - 1:  # 每一趟扫描到a[n-i-2]与a[n-1-1]比较为止结束
            if a[j] > a[j + 1]:  # 前面一位数比后一位数大的话,就交换两个数的位置
                t = a[j + 1]
                a[j + 1] = a[j]
                a[j] = t
            j += 1
        i += 1
a = [3, 2, 4, 1, 6, 7]
bubblesort(a,6)
for element in a:
    print(element,end="\t")

选择排序:
找出最大值与最后一个元素交换
3 7 4 2 6 1
1.
71进行交换
[3 1 4 2 6 ]	7
2.
6已经是数组当中的最大值,且在待排序数组的最后一个位置
[3 1 4 2]	6 7
3.
42进行交换
[3 1 2]	4 6 7
4.
32进行交换
[2 1] 3 4 6 7
5.
21进行交换
1 2 3 4 6 7

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

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
// int findMax(int arr[],int n)//其实我们找的不是最大值,而是最大值的下标
// {
// 	int max = arr[0];
// 	int i;
// 	for(i=0;i<n;i++)
// 	{
// 		if(arr[i]>max)
// 		{
// 			max = arr[i];
// 		}
// 	}
// 	return max;
// }
int findMaxPos(int arr[],int n)
{
	int max = arr[0];
	int pos = 0;
	int i;
	for(i=0;i<n;i++)
	{
		if(arr[i]>max)
		{
			max = arr[i];
			pos = i;
		}
	}
	return pos;
}
void selectionSort(int arr[],int n)
{
	while(n>1)
	{
		int pos = findMaxPos(arr,n);
		int temp = arr[pos];
		arr[pos] = arr[n-1];
		arr[n-1] = temp;
		n--;
	}
}
int main(int argc, char *argv[]) {
	int arr[] = {3,4,2,6,1,7};
	selectionSort(arr,6);
	int i;
	for(i=0;i<6;i++)
	{
		prinf("%d\n",arr[i]);
	}
	return 0;
}


##### # def findMax(arr,n):#其实我们不是找最大值,而是找最大值的下标
#     max = arr[0]
#     for i in range(n):
#         if(arr[i]>max):
#             max = arr[i]
#     return max
def findMaxPos(arr,n):#其实我们不是找最大值,而是找最大值的下标
    max = arr[0]
    pos = 0
    for i in range(n):
        if(arr[i]>max):
            max = arr[i]
            pos = i
    return pos
def selectionSort(arr,n):
    while n > 1:
        pos = findMaxPos(arr,n)
        temp = arr[pos]
        arr[pos] = arr[n-1]
        arr[n-1] = temp
        n -= 1
arr = [3,4,2,6,1,7]
selectionSort(arr,6)
for i in range(6):
    print("%d" % arr[i])


插入排序:
3 6 7 4 2 1 5
分为两个部分,一个部分已经排好序,一个部分还没有排好序
[3 6 7]4 2 1 54开始插入到我们前面已经排好序的数组中
写代码:
arr 0 1 2 3          i
    3 6 7 4          key

while(arr[i-1]>key)
{
	=>arr[i] = arr[i-1];
	i--;
}
arr[i] = key

3 6 7 4 2 1 5
3 6 7 这三个数字已经排好序
对4进行操作
从后往前进行比较
47比,4小于7
3 6 4 7       2 1 5先不管
对64,6大于4
3 4 6 7
对于43来说,3小于4,因此他俩不需要交换位置
3 4 6 7     2 1 5
下面对2进行操作
[3 4 6 7] 2 1 5
对于72来说,7大于2
3 4 6 2 7     1 5先不管他俩
下面62


#include <stdio.h>
#include <stdlib.h>
void insert(int arr[],int n)
{
	int key = arr[n];
	int i = n;
	while(arr[i-1]>key)
	{
		arr[i] = arr[i-1];
		i--;
		if(i==0)
		{
			break;
		}
	}
	arr[i] = key;
}
void insertionSort(int arr[],int n)
{
	int i;
	for(i=1;i<n;i++)
	{
		insert(arr,i);
	}
}
int main(int argc, char *argv[]) {
	int arr[] = {3,6,7,4,2,1,5};
	int i;
	insertionSort(arr,7);
	for(i=0;i<7;i++)
	{
		printf("%d\n",arr[i]);
	}
	return 0;
}

def insert(arr,n):
    key = arr[n]
    i = n
    while arr[i-1]>key:
        arr[i] = arr[i-1]
        i -= 1
        if i==0:
            break
    arr[i] = key
def insertionSort(arr,n):
    i = 1
    while i < n:
        insert(arr,i)
        i+=1
arr = [3,6,7,4,2,1,5]
insertionSort(arr,7)
for element in arr:
    print(element,end="\t")

计算机算法设计分析 期末试题 一。选择题 1、二分搜索算法是利用( A )实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 2、下列不是动态规划算法基本步骤的是( A )。 A、找出最优解的性质 B、构造最优解 C、算出最优解 D、定义最优解 3、最大效益优先是( A )的一搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 4、在下列算法中有时找不到问题解的是( B )。 A、蒙特卡罗算法 B、拉斯维加斯算法 C、舍伍德算法 D、数值概率算法 5. 回溯法解旅行售货员问题时的解空间树是( A )。 A、子集树 B、排列树 C、深度优先生成树 D、广度优先生成树 6.下列算法中通常以自底向上的方式求解最优解的是( B )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 7、衡量一个算法好坏的标准是(C )。 A 运行速度快 B 占用空间少 C 时间复杂度低 D 代码短 8、以下不可以使用分治法求解的是(D )。 A 棋盘覆盖问题 B 选择问题 C 归并排序 D 0/1背包问题 9. 实现循环赛日程表利用的算法是( A )。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 10、下列随机算法中运行时有时候成功有时候失败的是(C ) A 数值概率算法 B 舍伍德算法 C 拉斯维加斯算法 D 蒙特卡罗算法 11.下面不是分支界限法搜索方式的是( D )。 A、广度优先 B、最小耗费优先 C、最大效益优先 D、深度优先 12.下列算法中通常以深度优先方式系统搜索问题解的是( D )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 13.备忘录方法是那种算法的变形。( B ) A、分治法 B、动态规划法 C、贪心法 D、回溯法 14.哈弗曼编码的贪心算法所需的计算时间为( B )。 A、O(n2n) B、O(nlogn) C、O(2n) D、O(n) 15.分支限界法解最大团问题时,活结点表的组织形式是( B )。 A、最小堆 B、最大堆 C、栈 D、数组 16.最长公共子序列算法利用的算法是( B )。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 17.实现棋盘覆盖算法利用的算法是( A )。 A、分治法 B、动态规划法 C、贪心法 D、回溯法 18.下面是贪心算法的基本要素的是( C )。 A、重叠子问题 B、构造最优解 C、贪心选择性质 D、定义最优解 19.回溯法的效率不依赖于下列哪些因素( D ) A.满足显约束的值的个数 B. 计算约束函数的时间 C. 计算限界函数的时间 D. 确定解空间的时间 20.下面哪种函数是回溯法中为避免无效搜索采取的策略( B ) A.递归函数 B.剪枝函数 C。随机数函数 D.搜索函数 21、下面关于NP问题说法正确的是(B ) A NP问题都是不可能解决的问题 B P类问题包含在NP类问题中 C NP完全问题是P类问题的子集 D NP类问题包含在P类问题中 22、蒙特卡罗算法是( B )的一种。 A、分支界限算法 B、概率算法 C、贪心算法 D、回溯算法 23.下列哪一种算法不是随机化算法( C ) A. 蒙特卡罗算法B. 拉斯维加斯算法C.动态规划算法D.舍伍德算法 24. ( D )是贪心算法动态规划算法的共同点。 A、重叠子问题 B、构造最优解 C、贪心选择性质 D、最优子结构性质 25. 矩阵连乘问题的算法可由( B)设计实现。 A、分支界限算法 B、动态规划算法 C、贪心算法 D、回溯算法 26. 分支限界法解旅行售货员问题时,活结点表的组织形式是( A )。 A、最小堆 B、最大堆 C、栈 D、数组 27、Strassen矩阵乘法是利用( A )实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 29、使用分治法求解不需要满足的条件是(A )。 A 子问题必须是一样的 B 子问题不能够重复 C 子问题的解可以合并 D 原问题和子问题使用相同的方法解 30、下面问题(B )不能使用贪心法解决。 A 单源最短路径问题 B N皇后问题 C 最小花费生成树问题 D 背包问题 31、下列算法中不能解决0/1背包问题的是(A ) A 贪心法 B 动态规划 C 回溯法 D 分支限界法 32、回溯法搜索状态空间树是按照(C )的顺序。 A 中序遍历 B 广度优先遍历 C 深度优先遍历 D 层次优先遍历 33、下列随机算法中运行时有时候成功有时候失败的是(C ) A 数值概率算法 B 舍伍德算法 C 拉斯维加斯算法 D 蒙特卡罗算法 34.实现合并排序利用的算法是( A )。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 35.下列是动态规划算法基本要素的是( D )。 A、定义最优解 B、构造最优解 C
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值