简单插入排序
选当前数作为要插入的数据,从后往前看是否有比当前还小的, 如果有就进行交换 最后将当前数放入要插入的位置
void insert_sort(int* data , int length){ int i; for(int i = 1 ; i < length - 1; i++){ int index = data[i]; //哨兵 暂存数据 int j; for(j = i ; j > 0 && index < data[j-1] ; j--){ data[j] = data[j-1]; } if(j != i){ // 要插入的数据比前面小 否则没有进行交换直接进入下一次循环 data[j] = index; } } }
选择排序
每次拿当前数作为最小值 , 往后遍历 , 找到比最小值还小的数 , 更新下标 , 最后和当前数进行交换
void select_sort(int *data , int length){ int i; for(int i = 0 ; i < length - 1; i++){ int min = i; // 默认当前为最小 int j; for(j = i+1 ; j < length ; j++){ //遍历找到最小的下标 if(data[j] < data[min]) min = j; // 更新最小下标 } if(i != min){ // 如果找到比当前还小就交换 int temp = data[i]; data[i] = data[min]; data[min] = temp; } } }
希尔排序:
1. 分组
2. 遍历每个组
3. 组内进行插入排序
// 希尔排序 int shell_sort(int *data , int length){ int gap = 0; // 分组的跨度 int j , i; for(gap = length/2 ; gap >= 1 ; gap/=2){ //分组的次数 for(i = gap ; i < length ; i++){ //每次分组之后对组进行遍历 int temp = data[i]; for(j = i - gap ; j >= 0&&temp < data[j] ; j = j - gap){//组内循环 data[j+gap] = data[j]; } data[j+gap] = temp; } } return 0; }
快速排序
int sort(int *data , int left , int right){ if(left > right) return 0; int i = left; int j = right; int key = data[left]; // 哨兵 while(i < j){ while(i < j && key < data[j]) j--; //从又往左找比哨兵小的数 data[i] = data[j]; //交换 while(i < j && key > data[i]) i++; //从左找比哨兵大的数 data[j] = data[i]; // 交换 } // i == j data[i] = key; // 哨兵归位 // 递归 sort(data , left , i - 1); sort(data , i + 1 , right); } int quick_sort(int *data , int length){ sort(data , 0 , length - 1); }