直接插入排序

時間複雜度:

若是排序的數組是正序的,那麼時間複雜度至關於O(n),算法

而若是排序是隨機的,時間複雜度至關於O(n^2/4).數組

倒置的時間複雜度是最高的,O(n^2).ide

算法思想:

  該算法是設置了一箇中間存儲,每次讀到的數據存儲到中間值。向前遍歷,若是大於這個值,繼續向前,每次向前遍歷時,把數據向後移,最後空出的位置,就是他自己應該在的位置。所以,若是是一個正序的數組,就不會出現移動的狀況,時間複雜度也就下降了。spa

主要代碼:

void straightInsert(int *arr,int length){ int i,j,k; for(i=1;i<length;i++){ if(arr[i] < arr[i-1]){ k = arr[i]; //做爲中間值存儲每次的記錄值
            for(j=i-1;arr[j] > k;j--){ //把大於該值的元素都向後移
                arr[j+1] = arr[j]; } arr[j+1] = k; } } }

所有代碼:

#include <stdio.h> #include <stdlib.h> #include <time.h>
int arrtest1[10] = {3,4,7,8,0,9,1,2,6,5}; int arrtest2[10] = {0,1,2,3,4,5,6,7,8,9}; int arrtest3[10] = {9,8,7,6,5,4,3,2,1,0}; void copy(int *from,int *arr,int length); void print(int *arr,int length); void straightInsert(int *arr,int length); int main(){ clock_t start,end; int Arr[10]; int i; start = clock(); for(i=0;i<100000;i++){ copy(arrtest1,Arr,10); //print(Arr,10);
        straightInsert(Arr,10); //print(Arr,10);
 } end = clock(); printf("first test:%d\n",end-start); start = clock(); for(i=0;i<100000;i++){ copy(arrtest2,Arr,10); //print(Arr,10);
        straightInsert(Arr,10); //print(Arr,10);
 } end = clock(); printf("first test:%d\n",end-start); start = clock(); for(i=0;i<100000;i++){ copy(arrtest3,Arr,10); //print(Arr,10);
        straightInsert(Arr,10); //print(Arr,10);
 } end = clock(); printf("first test:%d\n",end-start); getchar(); return 0; } void straightInsert(int *arr,int length){ int i,j,k; for(i=1;i<length;i++){ if(arr[i] < arr[i-1]){ k = arr[i]; //做爲中間值存儲每次的記錄值
            for(j=i-1;arr[j] > k;j--){ //把大於該值的元素都向後移
                arr[j+1] = arr[j]; } arr[j+1] = k; } } } void copy(int *from,int *arr,int length){ int i; for(i=0;i<length;i++){ arr[i] = from[i]; } } void print(int *arr,int length){ int i; for(i=0;i<length;i++){ printf("%d ",arr[i]); } printf("\n"); }
View Code

運行示例:

相關文章
相關標籤/搜索