二分法插入排序--C

//
//  main.c
//  binarySort
//
//  Created by 韩雪滢 on 10/15/16.
//  Copyright © 2016 韩雪滢. All rights reserved.
//
//复杂度O(nlogn)
#include <stdio.h>
int a[10]={21,56,43,12,3,99,56,23,2,12};
int main()
{
    int i,j,k,low,high,mid,t;
    for(i=k=1;i<sizeof a/sizeof a[0];i++)//起始认为第一个元素是有序的,high=low=k-1=0,所以k=1,
    {
        low=0;
        high=k-1;
        while(low<=high)////折半查找时,low与high相遇,则找到插入位置
        {
            mid=(low+high)/2;
            if(a[mid]>=a[i])high=mid-1;///////元素比mid小,因此在low到mid-1范围内搜索位置
            else low=mid+1;
        }
        if(high<i|| a[low]!=a[i]) ///*****************  a[low]的值为当前排序的中位值,应该是插入的位置,退出while的条件为high<low,所以if条件成立说明插入的值不在
        {
            t=a[i];//保存当前的值,
            for(j=k-1;j>=low;j--) //////插入位置是low,所以low到high=k-1范围内的元素都要向后移动
                a[j+1]=a[j];
            a[low]=t; //////////////low被赋值为已经被覆盖掉的a[i],如果这里写a[i],此时的a[i]不是之前的a[i],已经移动过了
            k++;
        }
    }
    for(j=0;j<k;j++)
        printf("%4d",a[j]);
    printf("\n");

    return 0;
}
时间: 2024-10-29 04:42:28

二分法插入排序--C的相关文章

二分法插入排序

二分法插入排序 算法思想简单描写叙述:在插入第i个元素时,对前面的0-i-1元素进行折半,先跟他们中间的那个元素比,假设小,则对前半再进行折半,否则对后半进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间的全部元素后移,再把第i个元素放在目标位置上.二分法没有排序,仅仅有查找.所以当找到要插入的位置时.移动必须从最后一个记录開始,向后移动一位,再移动倒数第2位,直到要插入的位置的记录移后一位.二分插入排序是稳定的,平均时间O(n2)     void binsort(re

二分法插入排序算法的尝试

这是一个<算法导论>上的练习,可将插入排序的总体运行时间降至Θ(nlgn),我们先看看插入排序的算法代码: #include <stdio.h> int main(void) { int arr[] = {6,3,1,5,4,2}; int i, j; int temp; for(i = 1; i < sizeof(arr)/sizeof(int); i++) //运行时间Θ(n) { temp = arr[i]; j = i - 1; while(j >= 0 &am

排序—二分法插入排序

思路和插入排序一样,可见:http://www.cnblogs.com/PerkinsZhu/p/5664808.html 不同点: 在寻找插入位置的时候采用二分法定位.二分法怎么定位?…… 运行结果: 原数组:              21.8.2.18.0.9.27.12.5.24. 第0次循环排序结果: 8.21.2.18.0.9.27.12.5.24.第1次循环排序结果: 2.8.21.18.0.9.27.12.5.24.第2次循环排序结果: 2.8.18.21.0.9.27.12.5

矿Java开发学习之旅------&amp;gt;Java排序算法经典的二分法插入排序

一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为採用折半比較,就可以得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比較,就是在插入A[i]时,取A[i-1/2]的关键码值与A[i]的关键码值进行比較,假设A[i]的关键码值小于A[i-1/2]的关键码值.则说明A[i]仅仅能插入A[0]到A[i-1/2]之间.故能够在A[0]到A[i-1/2-1]之间继续使用折半比較:否则仅仅能插入A[i-1/2]到A[i-1]之间

【模板小程序】二分法插入排序

Java版源程序来自:http://www.cnblogs.com/PerkinsZhu/p/5674572.html,在此感谢. 1 #include <iostream> 2 #include <vector> 3 #include <string> 4 using namespace std; 5 6 void printArray(string str,vector<int>& array){ 7 cout<<str; 8 for

插入排序(JAVA)

package org.rev.algorithm; /**  * 插入排序:每次将一个待排序的记录,按其大小插入到前面已经排序的子序列的合适位置,直到全部插入.  *   * 1. 直接插入排序:和已经排序的部分逐一比较找到合适位置  *   * 2. 二分插入排序:使用二分法找到合适的位置  *   * 3. 希尔排序(Shell Sort):分组的直接插入排序  *   */ public class InsertionSort {   public static void main(St

iOS 排序算法总结、二分法查找

还有一个:二分插入排序  平均时间O(n2)   稳定 1.插入排序 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环,直到全部排好顺序. 直接插入排序是稳定的.算法时间复杂度O(n2)--[n的平方] main() { int  a[10],j,i,m; for(j=1;j<10;j++) { m=a[j]; for(i=j-1;i>=0;i--) { if(a[i]<m) b

各种排序算法的分析及java实现

各种排序算法的分析及java实现 排序一直以来都是让我很头疼的事,以前上<数据结构>打酱油去了,整个学期下来才勉强能写出个冒泡排序.由于下半年要准备工作了,也知道排序算法的重要性(据说是面试必问的知识点),所以又花了点时间重新研究了一下. 排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有可以分为以下几类: (1).插入排序:直接插入排序.二分法插入排序.希尔排序. (2).

js十大排序算法详解

十大经典算法导图  图片名词解释:n: 数据规模k:"桶"的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外内存 1.冒泡排序 1.1  原始人冒泡排序 function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len; i++) { for (var j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j+1]