C資料結構-幾種常見的排序:冒泡,選擇,插入,希爾
阿新 • • 發佈:2018-12-21
幾種常見的排序
實際開發中,我們最常見到最常使用的排序莫過於:氣泡排序、選擇排序、插入排序和希爾排序。希爾排序其實就是一種特殊的插入排序。#ifndef ALGORITHM_H #define ALGORITHM_H #define ARRAR_SIZEOF(a) ( sizeof((a)) / sizeof((a[0])) ) /** * 直接選擇排序 * @param arr 陣列指標 * @param size 陣列大小 */ void select_sort(int arr[], int size) { int i,j,min,tmp; for(i = 0; (i < size -1) && flag; i ++) { min = i; for(j = i + 1; j < size; j++) { if(arr[min] > arr[j]) { min = j; } } /* 當最小值的下標min與i不相等時才需要交換位置,否則i位置就是最小的 */ if( i != min) { tmp = arr[min]; arr[min] = arr[i]; arr[i] = tmp; } } } /** * 氣泡排序 * @param arr 陣列指標 * @param size 陣列大小 */ void bubble_sort(int arr[], int size) { int i,j,tmp,flag = 1; for(i = 0; (i < size - 1) && flag; i++ ) { flag = 0; for(j = 0;j < size - 1 - i; j++) { if(arr[j] > arr[j + 1]) { tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; flag = 1; } } } } /** * 直接插入排序 * @param arr * @param size */ void insert_sort(int arr[], int size) { int i,j,tmp; for(i = 1; i < size; i++) { tmp = arr[i]; for(j = i - 1;j >= 0;j--) { if(tmp > arr[j]) break; arr[j + 1] = arr[j]; } arr[j + 1] = tmp; } } /** * 希爾排序 * @param arr * @param size */ void shell_sort(int arr[], int size) { int i,j,tmp,gap = size; do { gap = gap / 3 + 1; for(i = gap; i < size; i += gap) { tmp = arr[i]; for(j = i - gap;j >= 0;j -= gap) { if(tmp > arr[j]) break; arr[j + gap] = arr[j]; } arr[j + gap] = tmp; } } while(gap > 1); } #endif // ALGORITHM