执行插入排序

时间:2011-08-21 09:13:26

标签: c

这是我的代码。

#include<stdio.h>
void insert(int member,int arr[],int size)
{
    int i,j;
    for(i=0;i<size;i++)
    {
        if(member<arr[i])
        {

            for( j=0;j<size-i;j++)
            {
                arr[size]=arr[size-1];
        }
         arr[i]=member;
         break;
         }
    }    
}
void insertsort(int arr[],int size)
{
    int newsize=1,member;
    for(newsize=1;newsize<size;newsize++)
    {
    member=arr[newsize];
    insert(member,arr,newsize);
    }
}
void main()
{
    int arr[100];
    int size,i;
    printf("enter the size");
    scanf("%d",&size);
    printf("enter numbers");
    for( i=0;i<size;i++)
    {
        scanf("%d",&arr[i]);
    }
    insertsort(arr,size);
    for(i=0;i<size;i++)
    printf("\n %d",arr[i]);
}

我不知道问题是什么,但在进入

元素数量:5;

输入数字45 23 87 345 12

OUTPUT 12 45 87 345 345。

有人可以告诉我这是什么问题吗?

5 个答案:

答案 0 :(得分:1)

在您的插入功能中,将arr[size]=arr[size-1];更改为arr[size-j]=arr[size-j-1];

当你进行插入时,我想你想在插入点向右移动1步之后移动所有数字,而是你只移动了最右边的数字。

void insert(int member,int arr[],int size)
{
    int i,j;
    for(i=0;i<size;i++)
    {
        if(member<arr[i])
        {
            for( j=0;j<size-i;j++)
            {
                arr[size-j]=arr[size-j-1];
            }
            arr[i]=member;
            break;
         }
    }     
}

答案 1 :(得分:0)

 for(i=1; i<N; i++)
    {
        Temp = A[i];
        j = i-1;
        while(Temp<A[j] && j>=0)
        {
            A[j+1] = A[j];
            j = j-1;
        }
        A[j+1] = Temp;
    }

答案 2 :(得分:0)

以下是插入排序的代码:

int InsertionSort()
{
    int max;
    int *numarray = 0;
int i,j,k,temp;

printf("\nProgram for Ascending order of Numeric Values using INSERTION SORT");
    printf("\n\nEnter the total number of elements: ");
    scanf("%d", &max);   

    numarray = (int*) malloc(sizeof(int) * max);

    for(i = 0; i < max; i++)
    {
        printf("\nEnter [%d] element: ", i + 1);
        scanf("%d", &numarray[i]);
    }

    printf("Before Sorting   : ");
    for(k = 0; k < max; k++)
        printf("%d ", numarray[k])
    printf("\n");

    for(i = 1; i < max; i++)
    {
        j = i;
        while(j > 0)
        {
            if(numarray[j-1] > numarray[j])
            {
                temp = numarray[j - 1];
                numarray[j - 1] = numarray[j];
                numarray[j] = temp;
                j--;
            }
            else
                break;
        }
        printf("After iteration %d ": ", i);
        for(k = 0; k < max; k++)
            printf("%d ", numarray[k] );
        printf("/*** %d numbers from the begining of the array are input and they are sorted ***/\n", i + 1);
    }

    printf("\n\nThe numbers in ascending orders are given below:\n\n");
    for(i = 0; i < max; i++)
    {
        printf("Sorted [%d] element: %d\n",i + 1, numarray[i]);
    }

    free(numarray);
    return 0;
}

输出为

使用INSERTION SORT

计算数值的升序

输入元素总数:8

输入[1]元素:80

输入[2]元素:60

输入[3]元素:40

输入[4]元素:20

输入[5]元素:10

输入[6]元素:30

输入[7]元素:50

输入[8]元素:70

升序中的数字如下:

Sorted [1]元素:10

排序[2]元素:20

排序[3]元素:30

Sorted [4]元素:40

Sorted [5]元素:50

排序[6]元素:60

Sorted [7]元素:70

排序[8]元素:80

答案 3 :(得分:0)

这是C#中的插入排序。您可以轻松地将其转换为C或C ++

class Program
{
    static void Main(string[] args)
    {
        int[] set = new[] { 5, 3, 2, 9, 6, 1, 7, 2 };
        int[] result = InsertionSort(set);
    }

    static int[]  InsertionSort(int[] list) {
        if (list.Length < 2) {
            return list;
        }
        for (int i = 0; i < list.Length - 1; i++) {
            for (int j = i + 1; j > 0 && list[j - 1] > list[j]; j--) {
                int temp = list[j - 1];
                list[j - 1] = list[j];
                list[j] = temp;
            }  
        }
        return list;
    }
}

答案 4 :(得分:0)

A是一个包含未排序元素的数组。 这个想法非常类似于您在典型的纸牌游戏中对卡片进行分类的方式。 你拿起第一张牌。然后你选择第二张卡等等......然后向后比较,直到你找到一张价值大于当前卡的卡片。然后,您可以在此位置插入当前卡片,有效地向后移动所有卡片。在此循环之后,手中的所有元素都会被排序。 我在http://www.worldkosh.com/2016/12/22/insertion-sort/

上有更详细的说明

这篇文章的灵感来自Cormen,Thomas H. Leiserson,Charles E。; Rivest,Ronald L。; Stein,Clifford(2001)[1990]。算法简介(第2版)。

伪代码 假设基于0的起始索引

Insertion_sort(array A) {
    for(int i = 1;i < n; i++) {
        key = A[i];
        for(int j = i-1; j>= 0 and A[j]>key; j--) {
            A[j +1] = A[j];
        }
        A[j+1] = key;       
    }  
}