/** 功能: 排序 *日期: 2017年9月24日 *作者: yzh *開發環境: QT **/ #include <stdio.h> #include <stdlib.h> #include <string.h> #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;i<MAX_LENGTH+1;i++){ list->r[i].key = rand()%1000; list->r[i].otherInfo = 96+i; } list->length = MAX_LENGTH+1; } //打印數組 int printf_SQ(SqList *list){ for(int i = 1 ; i<list->length ; i++){ if(i<list->length-1){ printf("%d,",list->r[i]); }else{ printf("%d\n",list->r[i]); } } } //插入排序 int sort_I(SqList *list){ int i,j; for(i = 2;i<list->length;++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; i<l->length;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;i<list->length;i++){ for(j = i+1;j<list->length ; 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 ; i<list->length ;i++){ list->r[0] = list->r[i]; int min = i; for(j = i+1; j<list->length ; 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 <node.h){ pivotloc = Partition(L, node.l, node.h); push(&stack,pivotloc+1,node.h); push(&stack,node.l,pivotloc-1); } } } void QuickSort(SqList *L) { // 算法10.8 // 對順序表L進行快速排序 //sort_Q(L, 1, 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; }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。