排序

 #pragma once

#include<stdlib.h>
#include<math.h>
#include<time.h>
typedef int KeyType;
typedef struct {
KeyType key;// 仅仅表示 是可以比较 排序的
// other 
} Comparable, *ComparablePtr;
// 工具函数---交换 
void swap(Comparable *a, Comparable *b)
{
Comparable temp;
if(a==b)
return;
temp = *a;
*a = *b;
*b = temp;
}
// 冒泡排序
// 
void bubbleSort(Comparable a[], int n)
{
int switched = 0;
int i;
int j;
int t;
for(i=0; i<n-1; i++)
{
t = n-1-i;// 为了效率  
for(j=0; j<t; j++)
{
if(a[j].key > a[j+1].key)
{
switched = 1;
swap(&a[j],&a[j+1]);
}
}
if(!switched)
break;
}
}
// 选择排序
// 每次选择一个最小的和放在数组的前部(或者最大的放在数组的后部)
void selectSort(Comparable a[], int n)
{
int i;
int j;
int minIndex;
for(i=0; i<n; i++)
{
minIndex = i;
for(j=i+1; j<n; j++)
{
if(a[minIndex].key > a[j].key)
{
minIndex = j;
}
}
swap(&a[i],&a[minIndex]);
}
}
// 插入排序
// 将后面的与前面的逐一比较,插入到适当的位置
void insertSort(Comparable a[], int n)
{
int i;
int j;
Comparable cmp;
for(i=0; i<n-1; i++)
{
cmp = a[i+1];
 j = i+1;
while(j>0)
{
if(cmp.key < a[j-1].key)
{
a[j] = a[j-1];
j--;
}
else
{
break;
}
}
a[j] = cmp; // 插入数据
}
}
// 归并排序
// 归并函数
// middle 属于 左边 
void merge(Comparable a[],int left,int middle, int right)
{
int i=left;
int j=middle+1;
int n = right-left+1;
int k;
Comparable *pTemp = (Comparable *)malloc(n*sizeof(Comparable));
int c = 0;
while(i<=middle && j<=right)
{
if(a[i].key > a[j].key)
{
pTemp[c++] = a[j];
j++;
}else
{
pTemp[c++] = a[i];
i++;
}
}
if(i==middle+1)
{// 左边的已存入 存入右边未存入的
for(k=0; k<=right-j;k++)
pTemp[c++] = a[j+k];
}else {// 右边的已存入 存入左边未存入的
for(k=0; k<=middle-i;k++)
pTemp[c++] = a[i+k];
}
for(c=0; c<n; c++)
a[left+c] = pTemp[c];
free(pTemp);
}
void mergeSort(Comparable a[], int n)
{
//int middle;
if(n>1)
{ //middle = n/2;
mergeSort(a,n/2);
mergeSort(&a[n/2], n-n/2);
merge(a,0,n/2-1,n-1);
}
}
// 堆排序
// 对排序的过程为:
// 1 建堆
// 2 删除根节点 直到堆为空 删除的节点值存入原数组
//
// 二叉搜索树排序
// 1 建立二叉搜索树 
// 2 中序遍历
// 
// 快速排序
// // 随机快速排序
void quickSort(Comparable a[], int n)
{
// 以第一个元素为基准  可以随机选择一个 
Comparable first;
int k ;
int i; 
int j;
if(n>1)
{
srand(time(0));
k = rand() % n; // 随机快速排序  令k等于一个特殊的值 就是快速排序了
first = a[k];
i = 0;
j = n-1;
while(i<j)
{
while(a[i].key < first.key) i++;
while(a[j].key > first.key) j--;
if(i<j)
swap(&a[i],&a[j]);
}
if(i>j)
swap(&a[k],&a[j]);
quickSort(a,j);
quickSort(&a[j+1],n-j-1);
}
}
// shell排序
// shell 排序是把原数组分成N/2 段 ,这些等分元素之间是有间隔的
void shellSort(Comparable a[], int n)
{
int  Y = n/2;
int i = 0; 
int  j = 0;
int  k  = 0;
Comparable cmp;
while(Y > 0)
{
for(i=0; i<Y; i++)
{// 分组
for(k=i+Y; k<n; k+=Y)
{
cmp=a[(k)];
j = (k);
while(j>i)
{
if(cmp.key < a[j-Y].key)
{
a[j] = a[j-Y];
j-=Y;
}else
break;
}
a[j] = cmp;
}
}
Y/=2;
}
}
// 基数排序
// 采用的基数为10 LSD最高位优先的基数排序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值