Algorithm - Sorting (Insertion Sort) 插入排序法
想法:
類似玩大老二在整理牌的時候
把所有牌分成已排序區和未排序區
初始假設第一張在已排序區
例如
在第一回合
把第二張拿來跟第一張比較
第二張如果小於第一張 => 第二張放在較小的位置
第二張如果大於第一張 => 第二張放在較大的位置
所以此時第一張和第二張的相對位置會是正確的
(第一二張位在已排序區,其他都是未排序區)
在第二回合
把第三張拿來跟已排序區的做比較
找到對的相對位置後插進去
所以此時這三張牌的相對位置會是正確的
以此類推
要注意一個地方
在插入的地方
要把插入的地方往後的地方(直到已排序區的尾巴)都往後移一格
記得要先移動最後面的值
如果從最前面開始移動
會把值一直往後覆寫
Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void swap(int *a, int *b);
void printarray(int size, int *data);
void generate_random_array(int size, int *data);
void bubblesort(int size, int *data);
void selectionsort(int size, int *data);
void insertionsort(int size, int *data);
void swap(int *a, int *b){
int tmp = *a;
*a = *b;
*b = tmp;
}
void printarray(int size, int *data){
printf("data: ");
for(int i = 0; i < size; i++){
printf("%d,", data[i]);
}
printf("\n");
}
void generate_random_array(int size, int *data){
srand(time(NULL));
for(int i = 0; i < size; i++){
data[i] = rand()%1000;
}
}
#include <stdio.h>
#include <stdlib.h>
#include "Sort.h"
void insertionsort(int size, int *data){
int i, j, k;
int tmp;
for(i = 1; i < size; i++){
for(j = 0; j < i; j++){
if(data[j] > data[i]){
tmp = data[i];
for(k = i-1; k >= j; k--){
data[k+1] = data[k];
}
data[j] = tmp;
break;
}
}
printarray(size, data);
}
}
void main(){
int size = 10;
int *data = (int*)malloc(sizeof(int) * size);
//generate random array
generate_random_array(size, data);
printf("original:\n");
printarray(size, data);
//sorting
printf("sorting:\n");
insertionsort(size, data);
//result
printf("result:\n");
printarray(size, data);
}
複雜度:
時間複雜度 O(n^2) 雙重迴圈
(雖然迴圈看起來是三重,但最裡面那層是接續第二層迴圈繼續往下的意思,所以不會是尋訪三遍)
空間複雜度 O(1) 只需要一個額外的暫存空間
留言
張貼留言