C語言 排序算法 - 數據結構學習筆記
/** 功能: 排序
*日期: 2017年9月24日
*作者: yzh
*開發環境: QT
**/
#include
#include
#include
#define MAX_STACK_LENGTH 100 //非遞歸快速排序調用棧
#define MAX_LENGTH 20 //數組最大值
//對於數值型 keyType
#define EQ(a,b) ((a) == (b)) //比較 a == b ?
#define LT(a,b) ((a) < (b)) //比較 a < b ?
#define LQ(a,b) ((a) <= (b)) //比較 a <= b ?
typedef int KeyType; //查找關鍵字類型
typedef char InfoType; //其他信息
typedef struct { // 信息體
KeyType key;
InfoType otherInfo;
}RedType;
typedef struct { //數組結構
RedType r[MAX_LENGTH+1]; //r[0]閒置或用作哨兵;
int length;
}SqList;
typedef struct { //棧節點
int l,h;
}StackNode;
typedef struct { //棧
StackNode node[MAX_STACK_LENGTH];
int idx;
}Stack;
//插入模擬數據
int insertSQ(SqList *list){
for(int i = 1;ir[i].key = rand()%1000;
list->r[i].otherInfo = 96+i;
}
list->length = MAX_LENGTH+1;
}
//打印數組
int printf_SQ(SqList *list){
for(int i = 1 ; ilength ; i++){
if(ilength-1){
printf("%d,",list->r[i]);
}else{
printf("%d\n",list->r[i]);
}
}
}
//插入排序
int sort_I(SqList *list){
int i,j;
for(i = 2;ilength;++i){
if(LT(list->r[i].key,list->r[i-1].key)){
list->r[0] = list->r[i];
list->r[i] = list->r[i-1];
for(j = i-2;LT(list->r[0].key,list->r[j].key); --j){
list->r[j+1] = list->r[j];
}
list->r[j+1] = list->r[0];
}
}
}
//插入排序改進:折半插入排序
int sort_B_I(SqList *l){
int i , j;
int low , high,mid;
for(i = 2; ilength;i++){
if(LT(l->r[i].key,l->r[i-1].key)){
l->r[0] = l->r[i];
l->r[i] = l->r[i-1];
low = 1;high = i-2;
while(low<=high){
mid = (low+high)/2;
if(LT(l->r[0].key,l->r[mid].key)){
high = mid -1;
}else{
low = mid+1;
}
}
for(j = i-2; j>high;j--){
l->r[j+1] = l->r[j];
}
l->r[high+1] = l->r[0];
}
}
}
//冒泡排序
int sort_B(SqList *list){
int i,j;
for(i = 1;ilength;i++){
for(j = i+1;jlength ; j++){
if(LT(list->r[j].key,list->r[i].key)){
list->r[0] = list->r[j];
list->r[j] = list->r[i];
list->r[i] = list->r[0];
}
}
}
}
//選擇排序
int sort_S(SqList *list){
int i,j;
for(i = 1 ; ilength ;i++){
list->r[0] = list->r[i];
int min = i;
for(j = i+1; jlength ; j++){
if(LT(list->r[j].key,list->r[0].key)){
list->r[0] = list->r[j];
min = j;
}
}
list->r[min] = list->r[i];
list->r[i] = list->r[0];
}
}
//快速排序
int Partition(SqList *L,int l ,int h){
L->r[0] = L->r[l];
while(LT(l,h)){
while(LT(l,h)&<(L->r[0].key,L->r[h].key)){--h;}
L->r[l] = L->r[h];
while(LT(l,h)&&LQ(L->r[l].key,L->r[0].key)){++l;}
L->r[h] = L->r[l];
}
L->r[l] = L->r[0];
return l;
}
//遞歸算法
void QSort(SqList *L, int low, int high) { //算法10.7
// 對順序表L中的子序列L.r[low..high]進行快速排序
int pivotloc;
if (low < high) { // 長度大於1
pivotloc = Partition(L, low, high); // 將L.r[low..high]一分爲二
QSort(L, low, pivotloc-1); // 對低子表遞歸排序,pivotloc是樞軸位置
QSort(L, pivotloc+1, high); // 對高子表遞歸排序
}
} // QSort
StackNode pop(Stack *stack){
StackNode node = stack->node[stack->idx];
stack->idx--;
return node;
}
void push(Stack *stack , int l,int h){
stack->idx++;
stack->node[stack->idx].h = h;
stack->node[stack->idx].l = l;
}
//非遞歸算法
void sort_Q(SqList *L,int low,int high){
int pivotloc;
Stack stack;
push(&stack,low,high);
StackNode node;
while(stack.idx>0){
node = pop(&stack);
if(node.l length-1); //調用非遞歸快速排序
//QSort(L, 1, L->length-1); //調用遞歸快速排序
} // QuickSort
int main(int argc, char *argv[])
{
// 測試棧
// Stack stack;
// push(&stack , 1,2);
// push(&stack , 2,3);
// push(&stack , 4,6);
// StackNode node= pop(&stack);
// printf("%d,%d\n",node.l,node.h);
// StackNode node2= pop(&stack);
// printf("%d,%d\n",node2.l,node2.h);
// StackNode node3= pop(&stack);
// printf("%d,%d\n",node3.l,node3.h);
// return 0;
SqList list;
insertSQ(&list); //插入模擬數據
printf_SQ(&list); //打印測試數據
//(41,467,334,500,169,724,478,358,962,464,705,145,281,827,961,491,995,942,827,436)
printf("-------------------------------------------\n");
// sort_B(&list); //冒泡排序
// sort_I(&list); //插入排序
// sort_S(&list); //選擇排序
// sort_B_I(&list); //插入排序改進:折中插入排序
QuickSort(&list); //快速排序
printf_SQ(&list); //打印排序後數組
//(41,145,169,281,334,358,436,464,467,478,491,500,705,724,827,827,942,961,962,995)
printf("-------------------------------------------\n");
return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.