排序整数数组时读取访问冲突

问题描述 投票:0回答:1

这个问题与我之前的问题有关(在此链接:使用快速排序算法对整数数组进行排序时出现的问题),我按以下方式编辑了我的解决方案:

#include "vector.h"

void QuickSort(Vector* v, size_t first, size_t last) {
    size_t i = 0; size_t j = 0;
    size_t pivot = 0;
    if (first <= last) {
        i = first; j = last; 
        pivot = (v->data[first] + v->data[last]) / 2; 
        do {
            while (v->data[i] < v->data[pivot]) i++;
            while (v->data[j] > v->data[pivot]) j--; 
            if (i <= j) {
                ElemSwap(&v->data[i], &v->data[j]); 
                i++; j--; 
            }
        } while (i <= j); 
        QuickSort(v, first, j); 
        QuickSort(v, i, last); 
    }
}
void VectorSort(Vector* v) {
    if (v == NULL) {
        return;
    }
    QuickSort(v, 0, v->size - 1);
}

int main(void) {
    ElemType v[16] = { 1, 3, 2, 9, 0, 4, 7, 8, 8, 7, 6, 5, 4, 3, 2, 1 };
    Vector* pv = calloc(1, sizeof(Vector)); 
    if (pv == NULL) {
        return NULL; 
    }
    pv->size = pv->capacity = 16; 
    pv->data = v; 
    VectorSort(pv); 
    return 0; 
} 

回想一下,elemtype.c 是这样定义的:

#define _CRT_SECURE_NO_WARNINGS
#include "elemtype.h"

#include <string.h>
#include <stdlib.h>

#define _unused(x) ((void)(x))

int ElemCompare(const ElemType *e1, const ElemType *e2) {
    return (*e1 > *e2) - (*e1 < *e2);
}

ElemType ElemCopy(const ElemType *e) {
    return *e;
}

void ElemSwap(ElemType *e1, ElemType *e2) {
    ElemType tmp = *e1;
    *e1 = *e2;
    *e2 = tmp;
}

void ElemDelete(ElemType *e) {
    _unused(e);
}

int ElemRead(FILE *f, ElemType *e) {
    return fscanf(f, "%d", e);
}

int ElemReadStdin(ElemType *e) {
    return ElemRead(stdin, e);
}

void ElemWrite(const ElemType *e, FILE *f) {
    fprintf(f, "%d", *e);
}

void ElemWriteStdout(const ElemType *e) {
    ElemWrite(e, stdout);
} 

elemtype.h 定义如下:

#ifndef ELEMTYPE_INT_H_
#define ELEMTYPE_INT_H_

#include <stdbool.h>
#include <stdio.h>

typedef int ElemType;


int ElemCompare(const ElemType *e1, const ElemType *e2);


ElemType ElemCopy(const ElemType *e);


void ElemSwap(ElemType *e1, ElemType *e2);


void ElemDelete(ElemType *e);

int ElemRead(FILE *f, ElemType *e);


int ElemReadStdin(ElemType *e);


void ElemWrite(const ElemType *e, FILE *f);


void ElemWriteStdout(const ElemType *e);

#endif // ELEMTYPE_INT_H_

现在,vector.h 是:

#pragma once
#include "ElemType.h"
#include <stdlib.h>
typedef struct {
    size_t capacity;
    size_t size;
    ElemType* data;
} Vector;

void VectorSort(Vector* v);

这个解决方案比前一个好,问题是当我调试时,我在这些行中有读取访问冲突:

while (v->data[i] < v->data[pivot]) i++;
while (v->data[j] > v->data[pivot]) j--;   

编辑:正如用户在评论部分建议的那样,我应该写:

while (v->data[i] < pivot) i++;
while (v->data[j] > pivot) j--;  

因为枢轴是一个数字,而不是一个位置

arrays c quicksort
1个回答
1
投票

你是说

pivot = (first + last) / 2
吗?

我不确定尝试访问

v->data[pivot]
意味着什么当枢轴是开始位置和最后位置之间的平均值的底部..

© www.soinside.com 2019 - 2024. All rights reserved.