#define MAXSIZE 10
typedef struct
{
int r[MAXSIZE+1];//用于存储排序数组,r[0]用作哨兵或临时变量
int length;//用于记录顺序表的长度
}SqList;
//
void swap(SqList* L,int i,int j){
int temp = L->r[i];
L->r[i] = L->r[j];
L->r[j] = temp;
}
//
void BubbleSort0(SqList* L){
int i,j;
for(i = 1;i<L->length;i++){
for(j = i+1;j<=L->length;j++){
if(L->r[i] > L->r[j])
swap(L,i,j);
}
}
}
//正宗的冒泡排序
void BuddleSort(SqList *L){
int i,j;
for(i = 1;i<L->length;i++){
for(j = L->length-1;j>=i;j--){
if(L->r[j]>L->r[j+1])
swap(L,j,j+1);
}
}
}
//冒泡排序的改进,如果有一趟没有进行排序,则已经排好序
//正宗的冒泡排序
void BuddleSort(SqList *L){
int i,j;
Status flag = TRUE;
for(i = 1;i<L->length&&flag;i++){
flat = false;
for(j = L->length-1;j>=i;j--){
if(L->r[j]>L->r[j+1])
{
swap(L,j,j+1);
flag = true;
}
}
}
}
//选择排序
void SelectSort(SqList *L){
int i,j,min;
for(i=1;i<L->length;i++){
min = i;
for(j = i+1;j<=L->length;j++){
if(L->r[min]>L->r[j])
min = j;
}
if(i != min)
swap(L,i,min);
}
}
//直接插入排序,
//r[0]哨兵的作用是暂时记录要排序的值
void InsertSort(SqList *L){
int i ,j;
for(i = 2;i<= L->length;i++){
if(L->r[i]<L->r[i-1]){
L->r[0] = L->r[i];
for(j = i-1;L->r[j]>L->r[0];j--){
L->r[j+1]= L->r[j];
L->j[j+1] = L->r[0];
}
}
}
//希尔排序
void ShellSort(SqList *L){
int i,j;
int increment = L->length;
do{
increment = increment/3 + 1;
for(i = increment+1;i<=L->length;i++){
L->r[0] = L->r[i];
for(j=i-increment;j>0&&L->r[0]<L->r[j];j-=increment)
L->r[j+increment] = L->r[j];
L->r[j+increment] = L->r[0];
}
}while(increment >1)
}
//快速排序
void QuickSort(QList* L){
QSort(L,1,L->length);
}
void QSort(QList *,int low,int high){
int pivot;
if(low<high){
pivot = Partition(L,low,high);
QSort(L,low,pivot-1);
QSort(L,pivot+1,high);
}
}
void Partion(QList *L,int low,int high)
{
int pivot;
int pivotkey = L->r[low];
while(low < high){
while(low < high&&L->r[high]>=pivotKey)
high--;
swap(L,low,high);
while(low<high&&L->r[low] <= pivotKey)
low++;
swap(L,low,high);
}
return low;
}
//堆排序
void HeapSort(SqList *L){
int i ;
for(i = L->length/2;i>0;i--){
HeapAdjust(L,i,L->length);
}
for(i = L->length;i>1;i--){
swap(L,1,i);
HeapAdjust(L,1,i-a);
}
}
//
void HeapAdjust(SqList *L,int s,int m){
int temp,j;
temp = L->r[s];
for(j = 2*s;j <= m;j*= 2){
if(j <m&&L->r[j]<L->r[j+1])
++j;
if(temp >= L->r[j])
break;
L->r[s] = L->r[j];
s = j;
}
L->r[s] = temp;
}
排序
最新推荐文章于 2024-08-28 22:01:42 发布