1.冒泡排序
要说冒泡应该是非常简单的一种排序了,思路就如其名,数据像是泡泡一样逐个上升。
/* * 冒泡排序 */ void bubbleSort(int *array , int length) { //设置flag来标示是否已经有序,用于优化冒泡排序 int flag; //共执行n-1趟 for(int i = 0 ; i < length - 1; i++) { //默认为已经有序 flag = 0; //从最后一个元素开始判断,因为每一趟都会排好一个元素,所以每一趟都会少比较一次 for(int j = length - 1 ; j > i ; j--) { //比较是否比前面的元素小 if(array[j-1] > array[j]) { //如果小就交换位置并且标示为非有序数组 swip(&array[j-1], &array[j]); flag = 1; } } //如果已经默认有序就不在进行 if(!flag) break; } }
这里说一下标示flag,如果已经有序比如1、2、3、4、5、6数组,但是内层循环依然会执行,只是不交换元素而已。当执行到没有元素交换的时候也就说明该数组已经有序了,这时就可以退出循环。
2.简单选择排序
简单选择排序就是先找当前位置为最小,判断后面是否有比当前元素小的,如果存在就和当前元素交换位置。相比冒泡排序简单选择的比较次数较多而交换最多就n-1次。
/* * 简单选择排序 */ void selectSort(int *array, int length) { //和冒泡排序一样,也是执行n-1次 for(int i = 0 ; i < length-1 ; i++) { //猜测当前位置为最小元素 int min = i; //执行n-i-1次,用于找到最小的元素 for(int j = i+1 ; j < length ;j++) { //如果当前元素比min位置小,那么当前位置为min if(array[min] > array[j]) min = j; } //如果min的位置发生变化,即当前位置不是min,那么交换位置 if(min != i) swip(&array[min], &array[i]); } }
3. 直接插入排序
直接插入排序思路也很简单,就不多说了。
/* * 直接插入排序 */ void insertSort(int *array ,int length) { //有几个元素就执行几次,默认最少两个元素,从第二个元素开始 for(int i = 1 ; i < length ; i++) { //如果当前位置比前一位置元素小 if(array[i] < array[i-1]) { //保存当前元素 int temp = array[i]; int j; //当前元素前面的所有比当前元素大的元素全部后移一位 for(j = i-1 ; array[j] > temp && j >= 0; j--) { array[j+1] = array[j]; } //把空出来的位置赋上保存的元素 array[j+1] = temp; } } }
4.希尔排序
希尔排序就是直接插入排序的一个升级,让序列先相对有序,然后在不断减小间隔重新分组使整个有序。
/* * 希尔排序 */ void shellSort(int *array ,int length) { //设置希尔排序的间隔(每次/2) int increment = length/2; //当间隔变为0时结束 while(increment >= 1) { //从第一个间隔位置开始,到最后,分好组对每一组进行直接插入排序 for(int i = increment ; i < length ; i++) { //和直接插入排序相同,只是间隔从直接插入的1变为了increment if(array[i] < array[i-increment]) { int j; int temp = array[i]; for(j = i - increment ; array[j] > temp && j >= 0 ; j -= increment) { array[j+increment] = array[j]; } array[j+increment] = temp; } } //更新间隔 increment /= 2; } }
时间: 2024-10-10 15:31:30