算法:插入排序

插入排序的算法分析:(未完)

可参考的排序算法的博客: http://blog.csdn.net/cjf_iceking/article/details/7916194

 这是剪贴的别人的插入排序的 函数代码。

#include <iostream>
#include <string>
#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

void InsertSort(int* pDataArray, int iDataNum)
{
    for (int i = 1; i < iDataNum; i++)    //从第2个数据开始插入
    {
        int j = 0;
        while (j < i && pDataArray[j] <= pDataArray[i])    //寻找插入的位置
            j++;

        if (j < i)    //i位置之前,有比pDataArray[i]大的数,则进行挪动和插入
        {
            int k = i;
            int temp = pDataArray[i];
            while (k > j)    //挪动位置
            {
                pDataArray[k] = pDataArray[k-1];
                k--;
            }
            pDataArray[k] = temp;    //插入
        }
    }
}

int main()
{
    int n;

    int a[200];
    int i;
    cin>>n;
    for(i=0; i<n; i++)
    {
        cin>>a[i];
    }
    InsertSort(a, n);

    for(i=0; i<n; i++)
    {
        if(i==n-1)
          cout<<a[i]<<endl;
          else
            cout<<a[i]<<" ";
    }
    return 0;
}

   

         这是我自己的插入函数 模板代码, 待排序数组的数据元素从下标1开始存储,一直存储到下标n。

     这个插入函数会将a[0] 设置成一个监测哨, 这样做的好处是:减少交换次数,减少了运行时间。

     

    

SDUT 排序

Time Limit: 1000ms   Memory limit: 32678K  有疑问?点这里^_^

题目描述

    给你N(N<=100)个数,请你按照从小到大的顺序输出。

输入

    输入数据第一行是一个正整数N,第二行有N个整数。

输出

    输出一行,从小到大输出这N个数,中间用空格隔开。

示例输入

5
1 4 3 2 5

示例输出

1 2 3 4 5

//插入排序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;

void Insert_sort(int a[], int n)
{
    int i, j;
    for(i=2; i<=n; i++)
    {
        if( a[i]<a[i-1] )
        {
            a[0]=a[i];
            for(j=i-1; a[0]<a[j]; j--)
            {
                a[j+1] = a[j];
            }
            a[j+1]=a[0];
        }
    }
}
int main()
{
    int n;
    int i, j;
    int a[100];

    while(scanf("%d", &n)!=EOF)
    {
        for(i=1; i<=n; i++)
        {
            scanf("%d", &a[i] );
        }
        Insert_sort(a, n);
        for(j=1; j<=n; j++)
        {
            printf("%d%c", a[j], j==n?'
':' ' );
        }
    }
    return 0;
}

                                                                 

                                                                               HDU 2020 绝对值排序

       

        Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 42143    Accepted Submission(s): 20476


Problem Description
输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。
 


Input
输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。
 


Output
对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行。
 


Sample Input
3 3 -4 2 4 0 1 2 -3 0
 


Sample Output
-4 3 2 -3 2 1 0

 

    算法: 使用结构体,x保留原数值,y保留该数的绝对值。 利用插入排序对结构体元素y进行排序,然后输出 排序后的的结构体的x元素。

      

//插入排序
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>

struct N
{
    int x;
    int y;
}a[200];

void Insert_sort( int n)
{
    int i, j;
    for(i=2; i<=n; i++)
    {
        if( a[i].y>a[i-1].y )
        {
            a[0]=a[i];
            for(j=i-1; a[0].y>a[j].y; j--)
            {
                a[j+1] = a[j];
            }
            a[j+1]=a[0];
        }
    }
}
int main()
{
    int n, dd;
    int i, j;

    while(scanf("%d", &n)!=EOF)
    {
        for(i=1; i<=n; i++)
        {
            scanf("%d", &dd );
            a[i].x = dd;
            a[i].y = abs(dd);
        }

        Insert_sort(n);

        for(j=1; j<=n; j++)
        {
            printf("%d%c", a[j].x, j==n?'
':' ' );
        }
    }
    return 0;
}

      

原文地址:https://www.cnblogs.com/yspworld/p/4049975.html