首页 > 代码库 > 插入排序

插入排序

/**

*直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。


*设数组为unsorted[0…n-1]


*1. 初始时,unsorted[0]自成1个有序区,无序区为unsorted[1..n-1]。令i=1


*2. unsorted[i]并入当前的有序区unsorted[0…i-1]中形成unsorted[0…i]的有序区间。


*3. i++并重复第二步直到i==n-1。排序完成。

*/

//低级

void insertion_sort_low(int unsorted[],int count)

{

    int i, j, k;

    for (i = 1; i < count; i++) {

        //unsorted[i]在前面的unsorted[0...i-1]有序区间中找一个合适的位置

        for (j = i - 1; j >=0; j--) {

            if (unsorted[j] < unsorted[i])

                break;

        }

        

        //如找到了一个合适的位置

        if (j != i - 1) {

            //将比unsorted[i]大的数据向后移

            int temp = unsorted[i];

            for (k = i - 1; k > j; k--) {

                unsorted[k + 1] = unsorted[k];

            }

            

            //unsorted[i]放到正确位置上, (j+1)

            unsorted[k + 1] = temp;

        }  

    }

}


//中级 精简。现在进行一下改写,将搜索和数据后移这二个步骤合并。即每次unsorted[i]先和前面一个数据unsorted[i-1]比较,如果unsorted[i] > unsorted[i-1]说明unsorted[0…i]也是有序的,无须调整。否则就令j=i-1,temp=unsorted[i]。然后一边将数据unsorted[j]向后移动一边向前搜索,当有数据unsorted[j]<unsorted[i]时停止并将temp放到unsorted[j + 1]处。

void insertion_sort_middle(int unsorted[],int count)

{

    int i, j;

    for (i = 1; i < count; i++) {

        if (unsorted[i] < unsorted[i - 1]) {

            int temp = unsorted[i];

            for (j = i - 1; j >=0 && unsorted[j] > temp; j--)

                unsorted[j + 1] = unsorted[j];

            unsorted[j + 1] = temp;

        }

    }

}


//高级 更精简 再对将unsorted[j]插入到前面unsorted[0…j-1]的有序区间所用的方法进行改写,用数据交换代替数据后移。如果unsorted[j]前一个数据unsorted[j-1] > unsorted[j],就交换unsorted[j]unsorted[j-1],再j--直到unsorted[j-1] <= unsorted[j]。这样也可以实现将一个新数据新并入到有序区间。

void insertion_sort_high(int unsorted[],int count)

{

    for (int i =1; i < count; i++) { //初始时,unsorted[0]自成1个有序区,无序区为unsorted[1..n-1]。令i=1

        for (int j = i-1; j>=0 && unsorted[j] > unsorted[j+1]; j--) {//unsorted[i]并入当前的有序区unsorted[0…i-1]中形成unsorted[0…i]的有序区间。

             swap(&unsorted[j], &unsorted[j +1]);

        }

    }

}


int main(int argc, const char * argv[])

{

    int unsorted[] = { 6,2, 4, 1, 5, 3, 7, 8, 9, 10, 11};

    //selection_sort(x, 11);

    

    //bubble_sort_low(unsorted, 11);

    //bubble_sort_middle(unsorted, 11);

    //bubble_sort_high(unsorted, 11);


    //insertion_sort_low(unsorted, 11);

    //insertion_sort_middle(unsorted, 11);

    insertion_sort_high(unsorted,11);


    for (int index =0; index<11; index++) {

        printf("%d ",unsorted[index]);

    }

    printf("\n");


}