|
希尔排序(Shell's Sort)又称“缩小增量排序”(Diminishing Increment Sort),是插入排序的一种更高效的改进版本,同时该算法是首次冲破 O(n^2*n*2) 的算法之一。 插入排序的痛点在于不管是否是大部分有序,都会对元素进行比较,如果最小数在数组末尾,想要把它移动到数组的头部是比较费劲的。希尔排序是在数组中采用跳跃式分组,按照某个增量 gap 进行分组,分为若干组,每一组分别进行插入排序。再逐步将增量 gap 缩小,再每一组进行插入排序,循环这个过程,直到增量为 1。 希尔排序基本步骤如下: - 选择一个增量 gap,一般开始是数组的一半,将数组元素按照间隔为 gap 分为若干个小组。
- 对每一个小组进行插入排序。
- 将 gap 缩小为一半,重新分组,重复步骤 2(直到 gap 为 1 的时候基本有序,稍微调整一下即可)。
希尔排序,分别用汇编语言,C语言,C++,java,python编写出来
当然!以下是希尔排序算法的示例代码,分别使用汇编语言、C语言、C++、Java和Python编写:
1. 汇编语言(x86汇编):
- assembly
- section .data
- array db 64, 25, 12, 22, 11
- length equ $ - array
- section .text
- global _start
- _start:
- mov ecx, length
- shr ecx, 1
- outer_loop:
- mov esi, ecx
- mov al, [array + esi]
- mov edi, esi
- inner_loop:
- cmp edi, length
- jae skip_shift
- mov dl, [array + edi + ecx]
- cmp al, dl
- jle skip_shift
- mov [array + edi], dl
- sub edi, ecx
- jmp inner_loop
- skip_shift:
- mov [array + edi], al
- dec ecx
- jnz outer_loop
- ; 输出排序后的数组
- mov ecx, length
- mov esi, 0
- print_loop:
- movzx eax, byte [array + esi]
- add eax, '0'
- push eax
- push msg_digit
- call printf
- add esp, 8
- inc esi
- loop print_loop
- ; 退出程序
-
复制代码 mov eax, 1
xor ebx, ebx
int 0x80
section .data
msg_digit db "%c ", 0
section .text
extern printf
2. C语言:
- #include <stdio.h>
- void shellSort(int arr[], int n) {
- for (int gap = n / 2; gap > 0; gap /= 2) {
- for (int i = gap; i < n; i++) {
- int temp = arr[i];
- int j;
- for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
- arr[j] = arr[j - gap];
- }
- arr[j] = temp;
- }
- }
- }
复制代码 int main() {
int arr[] = {64, 25, 12, 22, 11};
int n = sizeof(arr) / sizeof(arr[0]);
shellSort(arr, n);
printf("Sorted array: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr);
}
return 0;
}
3. C++:
- #include <iostream>
- using namespace std;
- void shellSort(int arr[], int n) {
- for (int gap = n / 2; gap > 0; gap /= 2) {
- for (int i = gap; i < n; i++) {
- int temp = arr[i];
- int j;
- for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
- arr[j] = arr[j - gap];
- }
- arr[j] = temp;
- }
- }
- }
复制代码 int main() {
int arr[] = {64, 25, 12, 22, 11};
int n = sizeof(arr) / sizeof(arr[0]);
shellSort(arr, n);
cout << "Sorted array: ";
for (int i = 0; i < n; i++) {
cout << arr << " ";
}
return 0;
}
4. Java:
- public class ShellSort {
- public static void shellSort(int[] arr) {
- int n = arr.length;
- for (int gap = n / 2; gap > 0; gap /= 2) {
- for (int i = gap; i < n; i++) {
- int temp = arr[i];
- int j;
- for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
- arr[j] = arr[j - gap];
- }
- arr[j] = temp;
- }
- }
- }
-
- }
复制代码 public static void main(String[] args) {
int[] arr = {64, 25, 12, 22, 11};
shellSort(arr);
System.out.print("Sorted array: ");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr + " ");
}
}
5. Python:
- def shellSort(arr):
- n = len(arr)
- gap = n // 2
- while gap > 0:
- for i in range(gap, n):
- temp = arr[i]
- j = i
- while j >= gap and arr[j - gap] > temp:
- arr[j] = arr[j - gap]
- j -= gap
- arr[j] = temp
- gap //= 2
复制代码rr = [64, 25, 12, 22, 11]
shellSort(arr)
print("Sorted array:", arr)
这些示例代码展示了如何使用不同的编程语言实现希尔排序算法。请根据您的需求和偏好选择适合您的语言。
扫码关注微信公众号,免费查看完整算法内容。
|
|
|
|
|