文章目录
- 一、插入排序
- 二、希尔排序
一、插入排序
思路:
当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移
如:
代码实现:
void test(int arr[],int size) {int ned ;//定义一个插入数据的前一个数据的下标for (int i = 0; i < size-1; i++) {ned = i;//从第一个开始int t = arr[ned + 1];//需要插入的数据while (ned >= 0)//当遍历到最后一个结束{if (arr[ned] > t)//比插入数据大就插入{arr[ned + 1] = arr[ned];//往后移动一位ned--;//--找下一个数据}else//找到比t小的结束break;}arr[ned + 1] = t;//在比t小的数据前一位插入
//这样就算那个数是最小的我,和下标为0那个位置比完后,ned=-1,
//我们也可以插入到下标为0 的位置}
}
void Print(int arr[], int size) {for (int i = 0; i < size; i++)printf("%d ", arr[i]);printf("\n");
}
int main() {int arr[] = { 8,6,9,3,5,1,0,4,2,7 };Print(arr, sizeof(arr) / sizeof(arr[0]));test(arr, sizeof(arr)/sizeof(arr[0]));Print(arr, sizeof(arr) / sizeof(arr[0]));return 0;}
运行结果:
时间复杂度:
第一层循环怎么都要走N次,第二层循环最好的结果为(已经排好序),为1次,
最坏的结果,(与想要的顺序相反),为N次
我们取最坏的结果,N ^ N次,所以时间复杂度O(N^N).
二、希尔排序
思路:
1.实质上还是使用插入排序的思想
2.我们将数组的数据进行分组排序,每间隔 gap 的为一组,这些排序叫做预排序,设置多组间隔为 gap ,经过预排序的数组就会接近有序
如:
3.那么这个 gap 怎么设置呢?,我们知道,当gap=1时就是相当于直接插入排序,因此我们可以这样设置,就是gap 由大到小,最后到1,结束
4.gap设置的特点
gap越大,大的数可以越快排到后面,小的数可以越快的排到前面,但是预排完,不是那么接近有序
gap越小 越接近有序
gap=1,就是直接插入排序
如:
代码实现:
void test1(int arr[], int size) {int gap = size;//设为数据的个数int ned = 0;while (gap!= 1)//结束条件;当gap=1时{gap = gap / 3 + 1;//除三或者二都可,每次都会减少,加1保证有一次gap=1//每间隔gap的数据就进行一次插入排序//结束条件:当i+gap>n时for (int i = 0; i < size - gap; i++){//以下和我们上面的插入排序一样ned = i;int t = arr[ned + f];while (ned >= 0) {if (arr[ned] > t) {arr[ned + gap] = arr[ned];ned -= gap;}elsebreak;}arr[ned + gap] = t;}}
}
void Print(int arr[], int size) {for (int i = 0; i < size; i++)printf("%d ", arr[i]);printf("\n");
}int main() {int arr[] = { 8,6,9,3,5,1,0,4,2,7 };Print(arr, sizeof(arr) / sizeof(arr[0]));test1(arr, sizeof(arr) / sizeof(arr[0]));Print(arr, sizeof(arr) / sizeof(arr[0]));return 0;
}
运行结果:
时间复杂度:
第一次循环每次除3就是,以3为底的logN,
当gap很大时,因为循环的次数减少,所以后两层循环的次数很接近N
当gap很小时,因为已经接近有序了,所以循环的次数也接近N
所以时间复杂度为 O(lonN*N)(以3为底的logN)
当然这只时估算的结果,不一定准确
严蔚敏老师他的数据结构这本书上是:O(N^1.3)
以上就是我的分享了,如果有什么错误,欢迎在评论区留言。
最后,谢谢大家的观看!