在 C 中使用指针对结构进行冒泡排序
Bubble sort of structures using pointers in C
我想使用冒泡排序算法和 C 中的指针对结构数组进行排序。
我有一个汽车结构:
typedef struct{
char model[30];
int hp;
int price;
}cars;
我为 12 个项目分配了内存:
cars *pointer = (cars*)malloc(12*sizeof(cars));
并从文件中读取数据:
for (i = 0; i <number ; i++) {
fscanf(file, "%s %i %i\n", (pointer+i)->model, &(pointer+i)->hp, &(pointer+i)->price);
}
我将指针 ptr
传递给 bubbleSort
函数:
bubbleSort(pointer, number);
这是我的 bubbleSort
函数:
void bubbleSort(cars *x, int size) {
int i, j;
for (i=0;i<size-1;i++) {
int swapped = 0;
for (j = 0; j < size - 1 - i; j++) {
if ( (x+i)->hp > (x+j+1)->hp ) {
cars *temp = (x+j+1);
x[j+1] = x[j];
x[j] = *temp;
swapped = 1;
}
}
if (!swapped) {
//return;
}
}
}
问题是我不知道如何使用指针交换项目。
void bubbleSort(cars *x, int size)
{
int i, j;
cars temp;
for (i=0;i<size-1;i++) {
for (j = i+1; j < size; j++) {
if ( (x+i)->hp > (x+j)->hp ) {
temp = x[j];
x[j] = x[i];
x[i] = temp;
}
}
}
}
这是对该代码下评论的回复;它表明我建议的那种交换较少...... :) 这里的代码:
#include <stdio.h>
#include <string.h>
typedef struct {
int x;
int hp;
} cars;
int swaps;
void bubbleSortB(cars *x, int size)
{
int i, j;
cars temp;
for (i=0;i<size-1;i++) {
for (j = i+1; j < size; j++) {
if ( (x+i)->hp > (x+j)->hp ) {
temp = x[j];
x[j] = x[i];
x[i] = temp;
swaps++;
}
}
}
}
void bubbleSortA(cars *x, int size)
{
int i, j;
for (i = 0; i < size-1; i++)
{
for (j = 0; j < size-1-i; j++)
{
if ( x[j].hp > x[j+1].hp )
{
cars temp = x[j+1];
x[j+1] = x[j];
x[j] = temp;
swaps++;
}
}
}
}
int main(void)
{
int i;
cars x[10]={ {1,4},{1,8},{1,12},{1,6},{1,5},{1,4},{1,8},{1,12},{1,6},{1,5} };
cars y[10]={ {1,4},{1,8},{1,12},{1,6},{1,5},{1,4},{1,8},{1,12},{1,6},{1,5} };
swaps=0;
bubbleSortA(x,10);
for(i=0;i<10;i++)
printf("%d ",x[i].hp);
printf("- swaps %d\n",swaps);
swaps=0;
bubbleSortB(y,10); //My sort
for(i=0;i<10;i++)
printf("%d ",y[i].hp);
printf("- swaps %d\n",swaps);
}
考虑以下排序功能的解决方案:
void bubbleSort(cars *x, int size)
{
int i, j;
for (i = 0; i < size-1; i++)
{
for (j = 0; j < size-1-i; j++)
{
if ( x[j].hp > x[j+1].hp )
{
cars temp = x[j+1];
x[j+1] = x[j];
x[j] = temp;
}
}
}
}
问题出在数据交换部分
使用这样的交换函数:
#define TYPE <your type>
void swap(TYPE *a, TYPE *b){
TYPE *temp = (TYPE*)malloc(sizeof(TYPE));
*temp = *a;
*a = *b;
*b = *temp;
free(temp);
}
或者这个,没有 malloc:
void swap(TYPE *a, TYPE *b){
TYPE temp;
temp = *a;
*a = *b;
*b = temp;
}
我想使用冒泡排序算法和 C 中的指针对结构数组进行排序。 我有一个汽车结构:
typedef struct{
char model[30];
int hp;
int price;
}cars;
我为 12 个项目分配了内存:
cars *pointer = (cars*)malloc(12*sizeof(cars));
并从文件中读取数据:
for (i = 0; i <number ; i++) {
fscanf(file, "%s %i %i\n", (pointer+i)->model, &(pointer+i)->hp, &(pointer+i)->price);
}
我将指针 ptr
传递给 bubbleSort
函数:
bubbleSort(pointer, number);
这是我的 bubbleSort
函数:
void bubbleSort(cars *x, int size) {
int i, j;
for (i=0;i<size-1;i++) {
int swapped = 0;
for (j = 0; j < size - 1 - i; j++) {
if ( (x+i)->hp > (x+j+1)->hp ) {
cars *temp = (x+j+1);
x[j+1] = x[j];
x[j] = *temp;
swapped = 1;
}
}
if (!swapped) {
//return;
}
}
}
问题是我不知道如何使用指针交换项目。
void bubbleSort(cars *x, int size)
{
int i, j;
cars temp;
for (i=0;i<size-1;i++) {
for (j = i+1; j < size; j++) {
if ( (x+i)->hp > (x+j)->hp ) {
temp = x[j];
x[j] = x[i];
x[i] = temp;
}
}
}
}
这是对该代码下评论的回复;它表明我建议的那种交换较少...... :) 这里的代码:
#include <stdio.h>
#include <string.h>
typedef struct {
int x;
int hp;
} cars;
int swaps;
void bubbleSortB(cars *x, int size)
{
int i, j;
cars temp;
for (i=0;i<size-1;i++) {
for (j = i+1; j < size; j++) {
if ( (x+i)->hp > (x+j)->hp ) {
temp = x[j];
x[j] = x[i];
x[i] = temp;
swaps++;
}
}
}
}
void bubbleSortA(cars *x, int size)
{
int i, j;
for (i = 0; i < size-1; i++)
{
for (j = 0; j < size-1-i; j++)
{
if ( x[j].hp > x[j+1].hp )
{
cars temp = x[j+1];
x[j+1] = x[j];
x[j] = temp;
swaps++;
}
}
}
}
int main(void)
{
int i;
cars x[10]={ {1,4},{1,8},{1,12},{1,6},{1,5},{1,4},{1,8},{1,12},{1,6},{1,5} };
cars y[10]={ {1,4},{1,8},{1,12},{1,6},{1,5},{1,4},{1,8},{1,12},{1,6},{1,5} };
swaps=0;
bubbleSortA(x,10);
for(i=0;i<10;i++)
printf("%d ",x[i].hp);
printf("- swaps %d\n",swaps);
swaps=0;
bubbleSortB(y,10); //My sort
for(i=0;i<10;i++)
printf("%d ",y[i].hp);
printf("- swaps %d\n",swaps);
}
考虑以下排序功能的解决方案:
void bubbleSort(cars *x, int size)
{
int i, j;
for (i = 0; i < size-1; i++)
{
for (j = 0; j < size-1-i; j++)
{
if ( x[j].hp > x[j+1].hp )
{
cars temp = x[j+1];
x[j+1] = x[j];
x[j] = temp;
}
}
}
}
问题出在数据交换部分
使用这样的交换函数:
#define TYPE <your type>
void swap(TYPE *a, TYPE *b){
TYPE *temp = (TYPE*)malloc(sizeof(TYPE));
*temp = *a;
*a = *b;
*b = *temp;
free(temp);
}
或者这个,没有 malloc:
void swap(TYPE *a, TYPE *b){
TYPE temp;
temp = *a;
*a = *b;
*b = temp;
}