/*
交换排序:冒泡排序,快速排序
运行环境:VS2010
*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define OK 1
#define TRUE 1
#define FALSE 0
#define MAXSIZE 50
typedef struct
{
int value;
}RedType;
typedef struct
{
RedType red[MAXSIZE+1]; //red[0]用作哨兵单元
int length;
}SqList;
SqList *CreateSqList()
{
int i = 0;
int j = 0;
char buf[4*MAXSIZE] = "";
char *ptr = NULL;
SqList *sqlist = (SqList *)malloc(sizeof(SqList));
memset(sqlist, 0, sizeof(SqList));
printf("请输入待排序数据,以逗号分隔,以分号结束\n"
"例:23,12,65,36,35;\n"
"input:");
scanf("%s", buf);
ptr = buf;
sqlist->red[i].value = 0; //red[0]不存值用作哨兵单元
i = 1;
while(*ptr != ';')
{
sqlist->red[i].value = atoi(ptr);
i++;
ptr = strstr(ptr, ",");
if(!ptr)
{
break;
}
ptr++;
}
sqlist->length = (i - 1);
return sqlist;
}
//冒泡排序
int BubbleSort(SqList *sqlist)
{
int i = 0;
int j = 0;
int change = TRUE;
for(i = 1; (change == TRUE)&&(i <= sqlist->length); i++)
{
change = FALSE;
for(j = 1; j <= sqlist->length - i + 1; j++)
{
if(sqlist->red[j].value < sqlist->red[j-1].value)
{
sqlist->red[0] = sqlist->red[j];
sqlist->red[j] = sqlist->red[j-1];
sqlist->red[j-1] = sqlist->red[0];
change = TRUE;
}
}
}
return OK;
}
//快速排序的一趟交换过程
int Partition(SqList *sqlist, int low, int high)
{
int pivotkey = 0;
sqlist->red[0] = sqlist->red[low]; //顺序表的第一个记录做枢轴记录
pivotkey = sqlist->red[low].value; //枢轴记录关键字
while(low < high) //从表的两端向中间扫描
{
while((low < high) && (pivotkey <= sqlist->red[high].value))
{
high--;
}
sqlist->red[low] = sqlist->red[high]; //将比枢轴记录小的记录移到低端
while((low < high) && (pivotkey >= sqlist->red[low].value))
{
low++;
}
sqlist->red[high] = sqlist->red[low]; //将比枢轴记录大的记录移到高端
}
sqlist->red[low] = sqlist->red[0]; //枢轴记录到位
return low; //返回枢轴的位置
}
//对顺序表的子表sqlist->red[low...high]做快速排序
int QSort(SqList *sqlist, int low, int high)
{
int pivotloc = 0;
if(low < high) //这个是结束条件
{
pivotloc = Partition(sqlist, low, high); //将sqlist->red[low...high]一分为二
QSort(sqlist, low, pivotloc - 1); //对高子表排序
QSort(sqlist, pivotloc + 1, high); //对低子表排序
}
return OK;
}
//快速排序
int QickSort(SqList *sqlist)
{
QSort(sqlist, 1, sqlist->length);
return OK;
}
//打印表中数据
int PrintSqList(SqList sqlist)
{
int i = 0;
for(i = 1; i <= sqlist.length; i++)
{
printf("%d,", sqlist.red[i].value);
}
printf("\b;\n");
return OK;
}
int main()
{
SqList *sqlist = NULL;
SqList *testSqList = NULL;
sqlist = CreateSqList();
testSqList = (SqList *)malloc(sizeof(SqList));
printf("\n冒泡排序:\n");
memcpy(testSqList, sqlist, sizeof(SqList));
PrintSqList(*testSqList);
BubbleSort(testSqList);
PrintSqList(*testSqList);
printf("\n快速排序:\n");
memcpy(testSqList, sqlist, sizeof(SqList));
PrintSqList(*testSqList);
QickSort(testSqList);
PrintSqList(*testSqList);
free(testSqList);
free(sqlist);
system("pause");
return 0;
}
交换排序(冒泡排序,快速排序)
最新推荐文章于 2022-10-09 23:04:45 发布