IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 《跟英雄哥学算法第一天》 -> 正文阅读

[数据结构与算法]《跟英雄哥学算法第一天》

(3条消息) 《C语言入门100例》_英雄哪里出来-CSDN博客

  • 算法100例

(3条消息) 《算法零基础100讲》_英雄哪里出来-CSDN博客

这第一天主要做了一下排序的题放上链接

(3条消息) 【第48题】实现一个冒泡排序_英雄哪里出来-CSDN博客

(3条消息) 【第49题】实现一个简单插入排序_英雄哪里出来-CSDN博客

??????(3条消息) 【第50题】实现一个简单选择排序_英雄哪里出来-CSDN博客

(3条消息) 【第51题】qsort 应用 | 整形数组的排序_英雄哪里出来-CSDN博客

  • 冒泡排序

冒泡排序的主要思想就是进行两个相邻元素之间比较大小。

这是一趟冒泡排序,这里一共9个元素,那就是有八个这样的冒泡排序,而一趟随着元素一次一次往前挪动,次数也就减少。所以第一层循环应该是总的排序次数,内层循环就是随着元素的移动次数减少也就是每一趟冒泡排序的次数。

第一个解法通过学习英雄哥的自己能独立写出来

#include<stdio.h>
void swap(int* a, int* b)//(1)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
int a[1001];
int main()
{
	int i,n,swapped,last;
	int a[5] = { 1,2,4,5,3 };//(2)
	 n = sizeof(a) / sizeof(a[0]);//(3)
		last = n;

		do {
			swapped = 0;
			for (i = 0; i < last - 1; i++) {//(4)
				if (a[i] > a[i + 1]) {(5)
					swap(&a[i], &a[i + 1]);//(6)
					swapped = 1;//(7)
				}
			}
			--last;(8)
		} while (swapped);
		for (i = 0; i < n; i++) {//(9)
			if (i)
				printf(" ");
			printf("%d", a[i]);
		}
		puts("");

	return 0;
}

英雄哥的解法:

(1):这个函数接口主要是进行交换两个元素

(2):创建一个自定义数组

(3):这里的n是数组的大小

(4):一共last个元素,所以排序last-1次

(5):实现升序排列如果前面元素大于后面的元素进行交换

(6):取出要交换的元素地址,实现Swap函数进行交换

(7):如果有两个元素交换就标记一下,最后如果没有元素交换swapped=0则终止循环

(8):每次排序完部分元素,待排序元素就减少。

(9):实现打印第一个元素前面没有空格,从第二个元素开始都会有空格。

第二种方法

void print(int arr[], int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
void Swap(int* n1, int* n2)
{
	int tmp = *n1;
	*n1 = *n2;
	*n2 = tmp;
}
void bubble_sort(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				Swap(&arr[j], &arr[j + 1]);
			}
		}
	}
}
int main()
{
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	print(arr, sz);
	return 0;
}
  • 插入排序

这里的插入排序主要思想(按照升序)就是先拿出第二个元素然后与第一个元素比较,如果第二个元素比第一个元素小的话就要进行交换,接着拿出拿出第三个元素与前两个元素比较,比较完之后进行交换,跳出循环后进行插入。

#include<stdio.h>
void print_sort(int a[], int sz)//打印函数
{
    int i = 0;
    for (i = 0; i < sz; i++) {
        printf("%d ", a[i]);
    }
}
int main()
{
    int a[] = { 17,10,8,29,37,14 };//创建数组
    int i, j;
    int sz = sizeof(a) / sizeof(a[0]);//计算整个数组的大小
    for (i = 1; i < sz; i++) {
,       int tmp = a[i];//拿出下标为1的元素(也就是第二个元素)
        for (j = i - 1; j >= 0; j--) {//(后一个元素与前面的元素比较)
            if (a[j] > tmp) {//如果前面的元素大于后面的元素就进行交换(这里的交换不是真正意义上//的交换,因为等比较元素之后跳出循环要进行插入元素)
                a[j + 1] = a[j];//进行交换
            }
            else {
                break;//如果两元素之间符合升序则跳出循环,接着比较下两个元素
            }
        }
        a[j+1] = tmp;//插入元素
    }
    print_sort(a, sz);
    return 0;
}
  • 选择排序

选择排序就是遍历整个数组然后找出最小的元素放在前面(这里可以看英雄哥的题解和动图)。

#include<stdio.h>
void swap(int* a, int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
void change_sort(int a[],int n)
{
    int i, j;
    for (i = 0; i < n - 1; i++) {
        int min = i;//起初记录第一元素的下标为最小下标;
        for (j = i + 1; j < n; j++) {
            if (a[j] < a[min]) {//待排序时的最小元素
                min = j;//进行下标交换(这里的交换不是真正意义上的交换,意思就是这里的j赋给min,min是j,但这里的j还是j(j没有变成min))
            }
        }
        swap(&a[i], &a[min]);//交换两个元素
    }
}
int main()
{
    int a[] = { 17,10,8,29,37,14 };
    int sz = sizeof(a) / sizeof(a[0]);
    change_sort(a, sz);
    int i = 0;
    for (i = 0; i < sz; i++) {
        printf("%d ", a[i]);
    }
    return 0;
  • qsort排序整型数组(我这个加了点难度模拟实现qsort在排序)
//模拟实现
void Swap(char* buff1, char* buff2, int width)
{
    for (int i = 0; i < width; i++) {
        int temp = *buff1;
        *buff1 = *buff2;
        *buff2 = temp;
        buff1++;
        buff2++;
    }
}

int cmp(const void* pa, const void* pb)
{
    return *(int*)pa - *(int*)pb;
}

void bubble_sort(void* base, int sz, int width, int(*cmp)(const void* pa, const void* pb)) {
    for (int i = 0; i < sz - 1; i++) {
        for (int j = 0; j < sz - 1 - i; j++) {
            if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0) {
                Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
            }
        }
    }
}
//打印
void print1_arr(int arr[], int sz)
{
    for (int i = 0; i < sz; i++) {
        printf("%d ", arr[i]);
    }
}

void test1()
{
    int arr[] = { 1,5,6,3,2,8,9,7,4,0 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr,sz,sizeof(int),cmp);
    print1_arr(arr, sz);
}
int main()
{
   test1();//模拟实现qsort排序整形
    return 0;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-03 16:22:02  更:2022-01-03 16:22:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:45:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码