網站首頁 編程語言 正文
冒泡排序算法的原理如下: 相鄰比較的元素。n個元素比較n-1次。
可以分為兩種比較方式。
第一種:重者沉,從第一個元素開始比較 ,如果第一個比第二個大,就交換他們兩個,否則,就不交換位置,然后再第二個比第三個比較大小···,依次向后比較,直到沒有任何一對數字需要比較。
第二種:輕者浮,從最后一個元素開始比較 ,如果第n個比第n-1個小,就交換他們兩個,否則,就不交換位置,然后再第n-1個比第n-2個比較大小···,依次向后比較,直到沒有任何一對數字需要比較。
具體代碼實現的方式有很多種
博主這里以順序表冒泡排序為例
//基于順序表的冒泡排序
#include <stdio.h>
#define LISTSIZE 100 // LISTSIZE 表示順序表可能的最大數據元素數目
/****** 順序表存儲結構 ******/
typedef struct
{
int list[LISTSIZE];
int length;
}SqList;
//初始化順序表
int InitList(SqList* L)
{
L->length = 0;
return 1;
}
//求順序表表長
int ListLenth(SqList L)
{
return L.length;
}
//判斷順序表是否為空
int ListEmpty(SqList L)
{
if (L.length <= 0)
{
return 1;
}
return 0;
}
//向順序表插入元素
int ListInsert(SqList* L, int pos, int item)
{
int i;
if (L->length >= LISTSIZE)
{
printf("順序表已滿,無法插入\n");
return 0;
}
if (pos <= 0 || pos > L->length + 1)
{ // 檢查元素插入位置是否在順序表里
printf("插入位置不合法\n");
return 0;
}
for (i = L->length - 1; i >= pos - 1; i--)
{ // 移動數據元素
L->list[i + 1] = L->list[i];
}
L->list[pos - 1] = item; // 插入元素
L->length++; // 表長加一
return 1;
}
// 遍歷順序表
int TraverList(SqList L)
{
int i;
for (i = 0; i < L.length; i++)
{
printf("%d ", L.list[i]);
}
printf("\n");
return 1;
}
// 交換位置函數 ,可以不單獨寫出來,在用的時候再寫
void swap(SqList* L, int i, int j)
{
int temp = L->list[i];
L->list[i] = L->list[j];
L->list[j] = temp;
}
// 冒泡排序之重者沉
//void BubbleSort(SqList* L)
//{
// int i, j, over;
// for (i = 0; i < L->length - 1; i++)
// {
// over = 1;
// for (j = 0; j < L->length - i - 1; j++)
// {
// if (L->list[j] > L->list[j + 1])
// {
// swap(L, j, j + 1);
// over = 0;
// }
// }
// if (over)
// {
// break;
// }
// TraverList(*L);
// }
//}
//冒泡排序之輕者浮
void BubbleSort(SqList* L)
{
int i, j, over;
for (i = 0; i < L->length - 1; i++)
{
over = 1;
for (j = L->length - 1; j > 0; j--) // 這里需要注意j
{
if (L->list[j - 1] > L->list[j])
{
swap(L, j - 1, j);
over = 0;
}
}
if (over)
{
break;
}
TraverList(*L);
}
}
int main()
{
SqList L;
int x;
char ch;
int pos = 1;
InitList(&L);
do
{
scanf_s("%d", &x);
ListInsert(&L, pos++, x);
} while ((ch = getchar()) != '\n');
BubbleSort(&L);
printf("The sorted List is\n");
TraverList(L);
return 0;
}
執行代碼如圖
重者沉
輕者浮
?
?
原文鏈接:https://blog.csdn.net/smallcabbage12/article/details/125304250
- 上一篇:交換單鏈表第n和n+1個鏈點
- 下一篇:SpringCloud之Eureka注冊中心
相關推薦
- 2022-04-18 WPF使用代碼創建數據模板DataTemplate_實用技巧
- 2022-11-26 詳解redis-cli?命令_Redis
- 2022-08-08 Android實現頁面跳轉_Android
- 2022-09-17 C++中stack的pop()函數返回值解析_C 語言
- 2021-12-09 Typora自動編號的具體操作_其它綜合
- 2022-05-15 Python語言實現二分法查找_python
- 2022-07-08 C#中的Dialog對話框_C#教程
- 2022-08-28 go?zero微服務高在請求量下如何優化_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支