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; }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章