一些简单的排序算法 c 语言实现
来源:互联网 发布:融华财富网络贷款 编辑:程序博客网 时间:2024/05/22 10:47
数据类型定义:
#define MAXSIZE 20#define N 8typedef int KeyType;typedef struct{ KeyType key;}RedType;typedef struct{ RedType r[MAXSIZE+1]; int length;}SqList;typedef SqList HeapType;
1、稍微改进后的冒泡排序:
void BubbleSort(int *array,int n){ int i = n,j;//数组长度 int lastSwap;//最后发生交换的位置 int temp; while(i > 1){ lastSwap = 1; for(j = 0; j < i;j++){ if(array[j+1] < array[j]){ { temp = array[j+1]; array[j+1] = array[j]; array[j] = temp; } lastSwap = j; } } i = lastSwap; }}
该算法相比普通的冒泡排序,主要增加了一个旗帜lastSwap来标记每一趟冒泡过程中,发生交换操作的位置,这样,当下一趟冒泡的时候,只需要比较到旗帜标记的位置即可。因为,旗帜标记的位置以后的元素,都已经是有序,从而减少不必要的比较。
2、插入排序:
void InsertSort(SqList *L){ int i,j; for(i = 2;i <= L->length; i++){ if((L->r[i]).key < (L->r[i-1]).key){ L->r[0] = L->r[i];//L->R[0]是辅助储存变量,本身不存储元素 L->r[i] = L->r[i-1]; for(j = i-2; (L->r[0]).key < (L->r[j]).key; j--){ L->r[j+1] = L->r[j]; } L->r[j+1] = L->r[0]; } }}
3、希尔排序:
void ShellInsert(SqList *L,int dk){ int i,j; for(i = dk+1;i<=L->length;++i){ if(L->r[i].key < L->r[i-dk].key){ L->r[0] = L->r[i]; for(j = i-dk;j>0 && (L->r[0].key < L->r[j].key);j-=dk){ L->r[j+dk] = L->r[j]; } L->r[j+dk] = L->r[0]; } }}void ShellSort(SqList *L,int dlta[],int t){ int k; for(k = 0; k < t;k++){ ShellInsert(L,dlta[k]); }}
4、堆排序:
void HeapAdjust(HeapType *H,int s,int m){ int j; RedType rc = H->r[s]; for(j = 2*s;j<=m;j*=2){ if(j < m && H->r[j].key < H->r[j+1].key) ++j; if(!(rc.key < H->r[j].key)) break; H->r[s] = H->r[j]; s = j; } H->r[s] = rc;}void HeapSort(HeapType *H){ int i; RedType temp; for(i = H->length/2;i>0;i--){ HeapAdjust(H,i,H->length); } for(i = H->length;i>1;--i){ temp = H->r[1]; H->r[1] = H->r[i]; H->r[i] = temp; HeapAdjust(H,1,i-1); }}
5、快速排序:
int Partition(SqList *L,int low,int high){ int pivotkey; L->r[0] = L->r[low]; pivotkey = L->r[low].key; while(low < high){ while(low < high && L->r[high].key >= pivotkey) --high; L->r[low] = L->r[high]; while(low < high && L->r[low].key <= pivotkey) ++low; L->r[high] = L->r[low]; } L->r[low] = L->r[0]; return low;}void QSort(SqList *L,int low,int high){ int pivotloc; if(low < high){ pivotloc = Partition(L,low,high); QSort(L,low,pivotloc-1); QSort(L,pivotloc+1,high); }}
一道anyview上的题目:
荷兰国旗问题,题目描述:
10.32⑤ 荷兰国旗问题:设有一个仅由红、白、兰
这三种颜色的条块组成的条块序列。请编写一个时
间复杂度为O(n)的算法,使得这些条块按红、白、
兰的顺序排好,即排成荷兰国旗图案。
实现下列函数:
void HFlag(FlagList &f)
/* "荷兰国旗"的元素为red,white和blue,*/
/* 分别用字符'0','1'和'2'表示 */
"荷兰国旗"的顺序表的类型FlagList定义如下:
#define red '0'
#define white '1'
#define blue '2'
typedef char ColorType;
typedef struct {
ColorType r[MAX_LENGTH+1];
int length;
} FlagList;
算法实现:
void HFlag(FlagList &f){ int i=1; int j=1;//每次都标记第一white出现的位置 int k = f.length; while(j<=k){ //注意循环结束的条件,这时候下标范围为f.length - k之间的元素已经排好序,全部是blue if(f.r[j] == red){ swap(f.r[i++],f.r[j++]); } else if(f.r[j] == white){ j++; } else{ swap(f.r[j],f.r[k--]); } } }
- 一些简单的排序算法 c 语言实现
- 本人整理的一些排序算法(c语言实现)
- C语言简单选择排序算法的实现
- 【算法】简单选择排序C语言实现
- C 语言 简单桶排序 算法&实现
- C语言简单实现冒泡排序算法
- C语言的一些排序算法
- C语言常见的一些排序算法
- C语言面试之排序专题,一些排序算法的实现
- 内部排序算法c语言简单实现实现
- C语言实现简单的冒泡排序
- 基本排序算法的C语言实现
- 插入排序算法的C语言实现
- 选择排序算法的C语言实现
- 冒泡排序算法的c语言实现
- 快速排序算法的c语言实现
- 快速排序算法的C语言实现
- 【算法】C语言实现的快速排序
- A06_RelativeLayout的属性设置
- 一步一步学习Ubuntu之JDK安装篇
- iPhone App开发实战手册学习笔记(7)之单例
- BFS hdu-4528 小明系列故事——捉迷藏
- 如何在AVD上安装apk软件
- 一些简单的排序算法 c 语言实现
- Android中对数据库进行CRUD操作
- 树
- C#运算符重载
- 小明A+B
- 让fedora18桌面显示图标
- Linux下SVN安装配置
- HDU-1228A+B
- jqGrid用法及增删改查方法