基数排序段错误

本博客的代码的思想和图片参考:好大学慕课浙江大学陈越老师、何钦铭老师的《数据结构》

下面是是我的代码

  1 /*
  2  * radixSortLSD.c
  3  * Implement radix sort of Least Significant Digit
  4  *
  5  *  Created on: 2017年5月23日
  6  *      Author: ygh
  7  */
  8 #include <stdio.h>
  9 #include <stdlib.h>
 10
 11 #define  MAX_LENGTH 10000
 12
 13 /*
 14  *The quantity of the the keys of element
 15  *For example 0-9999 have four keys
 16  */
 17 #define MAX_DIGIT 6
 18 /*
 19  *The quantity of the bucket.In this case ,we sort integer number
 20  *So the buckets is from 0 to 9
 21  */
 22 #define RADIX 10
 23
 24 #define BEGIN_DIGIT 0
 25
 26 /*
 27  * The type of the element type
 28  */
 29 typedef int elementType;
 30
 31 /*
 32  * Define a data structure for bucket node
 33  */
 34 typedef struct node *ptrToNode;
 35 typedef struct node {
 36     /*
 37      * The element type the bucket node store
 38      */
 39     elementType key;
 40     /*
 41      * A next point to point next element
 42      */
 43     ptrToNode next;
 44
 45 };
 46
 47 /*
 48  * Define a data structure for bucket head that
 49  * store the head point and rear point for the elements
 50  */
 51 typedef struct headNode {
 52     ptrToNode head, rear;
 53 };
 54
 55 /*
 56  * Define a array of headNode to store the all buckets
 57  */
 58 typedef struct headNode bucket[RADIX];
 59
 60 /*
 61  * Get the digit by the current number and current needed digit
 62  * @param x The current number
 63  * @param d The current digit
 64  * @return The digit needed
 65  */
 66 int getDigit(elementType x, int d) {
 67     int i;
 68     int di;
 69     for (i = 0; i < d; i++) {
 70         di = x % RADIX;
 71         x = x / RADIX;
 72     }
 73     return di;
 74 }
 75
 76 void LSDRadixSort(elementType a[], int n) {
 77     int d, di, i;
 78     /*
 79      * Define a bucket array to store all buckets
 80      */
 81     bucket b;
 82
 83     /*
 84      * Define three node point
 85      * @param temp Store temporary node
 86      * @param p A node point will be used when search
 87      * @param list A node point to build elements list and recovery
 88      * elements from finished sort
 89      */
 90     ptrToNode temp, p, list;
 91
 92     /*
 93      * Initialize each bucket head and rear into NULL
 94      */
 95     for (i = BEGIN_DIGIT; i < RADIX; i++) {
 96         b[i].head = b[i].rear = NULL;
 97     }
 98
 99     /*
100      * Change array elements into list elements,but it is DESC
101      */
102     for (i = 0; i < n; i++) {
103         temp = (ptrToNode) malloc(sizeof(struct node));
104         temp->key = a[i];
105         temp->next = list;
106         list = temp;
107     }
108
109     /*
110      * Do radix sort
111      */
112     for (d = 1; d <= MAX_DIGIT; d++) {
113         p = list;
114         while (p) {
115             di = getDigit(p->key, d);
116             if (p->key < 0) {
117                 di = di * (-1);
118             }
119             /*
120              * Delete this element from the list
121              */
122             temp = p;
123             p = p->next;
124             temp->next = NULL;
125             if (b[di].head == NULL) {
126                 b[di].head = b[di].rear = temp;
127             } else {
128                 b[di].rear->next = temp;
129                 b[di].rear = temp;
130             }
131         }
132
133         /*
134          * Recover the elements has been deal with,using
135          * the list to point the head
136          */
137         list = NULL;
138         for (di = RADIX - 1; di >= BEGIN_DIGIT; di--) {
139             if (b[di].head) {
140                 b[di].rear->next = list;
141                 list = b[di].head;
142                 /*
143                  * Clear the head and rear
144                  */
145                 b[di].rear = b[di].head = NULL;
146             }
147         }
148     }
149
150     /*
151      * Put sorted list data to array
152      */
153     for (i = 0; i < n; i++) {
154         temp = list;
155         list = list->next;
156         a[i] = temp->key;
157         free(temp);
158     }
159
160 }
161
162 /*
163  * Print the array to console
164  * @param a A integer array need to sort
165  * @param n The length of the array
166  */
167 void printArray(int a[], int n) {
168     int i;
169     for (i = 0; i < n; i++) {
170         if (i == n - 1) {
171             printf("%d", a[i]);
172         } else {
173             printf("%d ", a[i]);
174         }
175     }
176     printf("\n");
177 }
178
179 /*
180  * Get input data from command
181  */
182 void getInputData(elementType *a, int n) {
183     int i;
184     elementType x;
185     for (i = 0; i < n; i++) {
186         scanf("%d", &x);
187         a[i] = x;
188     }
189 }
190
191 /*
192  * Separate a array into positive array and negative array
193  * @param a A array store the positive number or negative number
194  * @param n The length of the a
195  * @param pL The length of the positive array
196  * @param pL The length of the negative array
197  */
198 void separate(elementType *a, int n, int *pL, int *nL, elementType positiveArr[],
199         elementType negativeArr[]) {
200     int i;
201     for (i = 0; i < n; i++) {
202         if (a[i] < 0) {
203             negativeArr[(*nL)++] = a[i];
204         } else {
205             positiveArr[(*pL)++] = a[i];
206         }
207     }
208 }
209
210 void radixSort(elementType a[], int n) {
211     int positiveArr[MAX_LENGTH];
212     int negativeArr[MAX_LENGTH];
213     int pL = 0, nL = 0, i, j;
214     separate(a, n, &pL, &nL, positiveArr, negativeArr);
215     LSDRadixSort(positiveArr, pL);
216     LSDRadixSort(negativeArr, nL);
217     i = nL - 1;
218     j = 0;
219     while (i >= 0) {
220         a[j] = negativeArr[i];
221         i--;
222         j++;
223     }
224     i = 0;
225     while (i < pL) {
226         a[j] = positiveArr[i];
227         i++;
228         j++;
229     }
230
231 }
232
233 int main() {
234     elementType a[MAX_LENGTH];
235     int n;
236     scanf("%d", &n);
237     getInputData(a, n);
238     radixSort(a, n);
239     printArray(a, n);
240     return 0;
241 }
时间: 2024-10-25 11:32:12

基数排序段错误的相关文章

程序猿之---C语言细节24(段错误、类型提升、sizeof &#39;A&#39;)

主要内容:段错误.类型提升.sizeof  'A' #include <stdio.h> int main() { union test{ char a[10]; int b; }u; int *p = (int *)&(u.a[1]); // 没有引起总线错误 *p = 17; printf("%d\n",*p); #if 0 int *q = 0; // 引起段错误,在linux中运行可看到段错误,在windows下运行时直接出错 *q = 1; #endif

什么是core dump linux下用core和gdb查询出现&quot;段错误&quot;的地方

什么是core dump   linux下用core和gdb查询出现"段错误"的地方 http://blog.chinaunix.net/uid-26833883-id-3193279.html 有些时候我们在一段C代码的时候,由于对一个非法内存进行了操作,在程序运行的过程中,出现了"段错误". 呵呵,这种问题我想很多人会经常遇到.遇到这种问题是非常无语的,只是提示了"段错误",接着什么都没 有,如果我们一味的去看代码找太疼苦了,因为我们都相信自

函数栈溢出引起的段错误segmentation fault

遇到了一个奇怪的问题: 有一个回调函数中发生了段错误,但经检查也没有什么明显的错误,然后用排除法一点一点屏蔽,最后定位在一个函数里出错,但这个函数没什么明显错误.最后把入口参数改为引用传递就不报错误. 但隔了一段时间这个函数又报错了,原因是我加一行代码,但这行代码就是一个赋值语句:于是我不甘心,又开始排除法,最后定位到一个变量,加上它报错,不加就不报错:我一直怀疑是不是linux对一个函数的大小有限制:于是将这个函数换成全局变量,而在此函数中用的此变量时候采用指针,诶,不再报段错误了,世界终于安

结构体指针之 段错误 具体解释(segmentation fault)

一个网友问了我一个问题.一个C程序执行出现了段错误,这个问题非常好.非常多刚開始学习的人都easy犯这个错误,详细代码例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 这个编译没有问题,可是执行是段错误    Segmentation fault 由于你定义了一个结构体指针p.用来指向此类

段错误调试神器 - Core Dump详解

一.前言: 有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). 这通常都是指针错误引起的. 但这不像编译错误一样会提示到文件某一行, 而是没有任何信息, 使得我们的调试变得困难起来. gdb: 有一种办法是, 我们用gdb的step, 一步一步寻找. 这放在短小的代码中是可行的, 但要让你step一个上万行的代码, 我想你会从此厌恶程序员这个名字, 而把他叫做调试员. 我们还有更好的办法, 这就是core file. ulimit: 如果想让系统在信号中断造成的错误时

通过gdb快速定位“段错误”的位置

有些时候我们在一段 C/C++ 代码的时候,由于对一个非法内存进行了操作,在程序运行的过程中,出现了"Segmentation fault (core dumped)"--段错误. 呵呵,这种问题我想很多人会经常遇到.遇到这种问题是非常无语的,只是提示了"段错误",接着什么都没有,如果我们一味的去看代码找太疼苦了,因为我们都相信自己写的代码没问题,现实就是现实.接着,我们可能通过打印来定位到段错误的位置,这样会有个问题,如果代码量大,我们需要打印很多信息才能找到&q

Linux下运行C++程序出现&quot;段错误(核心已转储)&quot;的原因

今天写程序出现了“段错误(核心已转储)"的问题,查了一下资料,加上自己的实践,总结了以下几个方面的原因. 1.内存访问出错  这类问题的典型代表就是数组越界. 2.非法内存访问 出现这类问题主要是程序试图访问内核段内存而产生的错误. 3.栈溢出  Linux默认给一个进程分配的栈空间大小为8M.c++申请变量时,new操作申请的变量在堆中,其他变量一般在存储在栈中.  因此如果你数组开的过大变会出现这种问题.  首先我们先看一下系统默认分配的资源: 1 ulimit -a 可以看到默认分配的栈大

段错误以及调试方式

dummy_function(void) { unsigned char * ptr=0x00; *ptr=0x00; } int main() { dummy_function(); return 0; }作为一名熟练的c/c++程序员,以上代码的bug应该是很清楚的,因为它尝试操作地址为0的内存区域,而这个地址区域通常是不可访问的禁区,当然会出错了. 方法1 :利用gdb逐步查找段错误 这种方法也是被大众所熟知并广泛采用的方法,首先我们需要一个带有调试 信息的可执行程序,所以我们加上"-g

strcat函数造成的段错误(Segmentation fault)

转自:http://book.51cto.com/art/201311/419441.htm 3.21  strcat函数造成的段错误 代码示例 int main() { char dest[7]="12345"; char* src = "abcdefghigklmnopqrstuvwxyz"; strcat(dest, src); cout << "dest:" << dest << endl; retur