数据结构-排序-分配类排序-知识点总结归纳3
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                数据结构-排序-分配类排序-知识点总结归纳3
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.                        
                                分配類排序:核心是分配和收集,利用關(guān)鍵字的優(yōu)先級進(jìn)行排序的思想?
高位優(yōu)先排序:比如橋牌,先比較花色在比較面值;比如學(xué)號,比較級,院,班,號;
低位優(yōu)先排序: 鏈?zhǔn)交鶖?shù)排序
 思想:基于"分配"和"收集"的操作, 將單關(guān)鍵字轉(zhuǎn)化為多關(guān)鍵字排序
 將鏈表作為存儲結(jié)構(gòu), 待排序記錄以指針相連,構(gòu)成鏈表;
 分配:按照關(guān)鍵字取值分配記錄到鏈隊(duì)列相應(yīng)隊(duì)列中,每個(gè)隊(duì)列關(guān)鍵字取值相同
 收集:按照關(guān)鍵字大小,從小到大,將隊(duì)列首尾相接連接成一個(gè)鏈表;
 重復(fù)上述步驟..
定義:
?
//待排序記錄結(jié)點(diǎn) typedef struct node{int data;//比如說一個(gè)三位數(shù) struct node *next; }TNode;//隊(duì)列首尾指針 typedef struct{node *front;node *rear; }TPointer;?
//根據(jù)數(shù)組R[](已經(jīng)存在元素),構(gòu)建帶頭結(jié)點(diǎn)待排序記錄鏈表 TNode *create_list(int R[], int n){TNode *p, *ph;//p為每一個(gè)存了記錄的結(jié)點(diǎn), ph為頭結(jié)點(diǎn)ph = (TNode *)malloc(sizeof(TNode));if(!ph) return NULL; ph->next = NULL;int i;for(i = 0; i < n; i++){p = (TNode *)malloc(sizeof(TNode));if(!p) return NULL;p->data = R[i];//頭插法插入 p->next = ph->next;ph->next = p;}return ph;//返回頭結(jié)點(diǎn) } #define N 10 //分配算法,對三位數(shù)的記錄序列按照關(guān)鍵字低位排序分配 void dispatch(TNode *ph, TPointer *Q, int d){ //ph存記錄, Q隊(duì)列:存指針,d根據(jù)關(guān)鍵字到那一趟取值不同 TNode *p = NULL;//作為輔助空間拆分ph int i, idx;//初始化Qfor(i = 0; i < N; i++){Q[i].front = NULL;Q[i].rear = NULL; } p = ph->next;if(p){ph->next = p->next;p->next = NULL;}//第一個(gè)記錄被單獨(dú)拆到p里面while(p){idx = p->data;for(i = 0; i < d; i++)idx = idx / N;//第一趟排序,d = 0idx = idx % N;//根據(jù)關(guān)鍵字分配到Q中if(Q[idx].front = NULL){Q[idx].front = p;Q[idx].rear = p;} else{//尾插法 Q[idx].rear->next = p;Q[idx].rear = p;}p = ph->next;if(p){//拆,直到拆完 ph->next = p->next;p->next = NULL;}} }void collect(TNode *ph, TPointer *Q){TNode *p;int i;//ph為頭結(jié)點(diǎn),最終可以傳出去for(i = 0; !Q[i].front; i++);//找出第一個(gè)隊(duì)列中非空結(jié)點(diǎn)ph->next = Q[i].front;p = Q[i].rear;i++;for(; i < N; i++){if(Q[i].front){p->next = Q[i].front;p = Q[i].rear;//注意的是Q[i]內(nèi)部的結(jié)點(diǎn)是連接好的 }}p->next = NULL; } void list_sort(int *R, int n){int i;TNode *ph, *p;TPointer Q[N];int m = max(R, n);ph = create_list(R, n);for(i = 0; m; i++, m /= N){dispatch(ph, Q, i);collect(ph, Q);}for(i = 0, p = ph->next; p; p = p->next){R[i] = p->data;}free(ph); }?
總結(jié)
以上是生活随笔為你收集整理的数据结构-排序-分配类排序-知识点总结归纳3的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。