冒泡、插入、归并、快速、基数、桶、堆、计数、希尔九大排序

一、冒泡排序

入门级排序,简单双重循环,以下用go实现

func Sort(a []int) []int {
	for i := 0; i < len(a); i++ {
		for j := i + 1; j < len(a); j++ {
			if a[i] > a[j] {
				temp := a[j]
				a[j] = a[i]
				a[i] = temp
			}
		}
	}
	return a
}

二、 插入排序

假设a[0~i]是有序的,那么第i+1 位置的确认,只需要 从i to 0,找到合适的位置即可
在这里插入图片描述
在这里插入图片描述

// 1,3,2,4,5,7,9,10,22,11
// a[j]
// a[i~ j-1]
// 插入排序
func InsertSort(a []int) []int {
	j := 1
	for j < len(a) {
		cur := a[j]
		for i := j - 1; i >= 0; i-- {
			if a[i] > cur {
				a[i+1] = a[i]
			} else {
				a[i+1] = cur
				break
			}
		}
		j++
	}
	return a
}

三、 归并排序

在这里插入图片描述
在这里插入图片描述

func MergeArr(a []int, start, mid, end int, result []int) {
	i := start
	j := mid + 1
	k := 0
	for i <= mid && j <= end {
		if a[i] <= a[j] {
			result[k] = a[i]
			i++
		} else {
			result[k] = a[j]
			j++
		}
		k++
	}
	for i <= mid {
		result[k] = a[i]
		i++
		k++
	}
	for j <= end {
		result[k] = a[j]
		j++
		k++
	}

	for i := 0; i < k; i++ {
		a[start+i] = result[i]
	}
	return
}
func MergeSort(a []int, start, end int, result []int) {
	if start < end {
		mid := (start + end) / 2
		MergeSort(a, start, mid, result)
		MergeSort(a, mid+1, end, result)
		MergeArr(a, start, mid, end, result)
	}
	return
}

四、堆排序

完全二叉树的性质
1、维护大顶堆,根节点大于左右
2、用数组存在时,i 为根节点,左右节点分别为2i+1 2i+2

维护大顶堆代码

func maxHeapify(a []int,heapSize,i int) {
   if i >= heapifySize {
   		return
   }
   left := 2*i + 1
   right := 2*i + 2
   max := i
   if left <= heapSize && a[left] > a[max] {
       max = left
   }
   if right <= heapSize && a[right] > a[max] {
      max = right
   }
   if max != i {
      swap(a,i,max)
      maxHeapify(a,heapSize,max)
   }
}

建堆

func bulidMaxHeapify(a []int) {
  heapifySize := len(a) - 1
  i := len(a)/2
  for i >= 0 {
  		maxHeapify(a,heapifySize,i)
  		i--
  }
}

堆排序

func heapSort(a []int) {
    // 建堆
    bulidMaxHeapify(a)
    length := len(a) - 1
    for ;i>=0;i-- {
      swap(a,i,0)
      length -= 1
      maxHeapify(a, length, 0)
    }
}

五、快速排序

func quickSort(a []int, p, r int) {
	if p < r {
		q := partition(a, p, r)
		quickSort(a, p, q-1)
		quickSort(a, q+1, r)
	}
}

func partition(a []int, p, r int) int {
	x := a[r] 
	i := p - 1 
	for j := p; j <= r-1; j++ {
		if a[j] <= x {
			i += 1
			swap(a, i, j)
		}
	}
	swap(a, i+1, r)
	return i + 1
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是C语言实现各种排序方法的代码示例: 1. 冒泡排序 ``` c void bubble_sort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ``` 2. 选择排序 ``` c void selection_sort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { int min_index = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[min_index]) { min_index = j; } } int temp = arr[i]; arr[i] = arr[min_index]; arr[min_index] = temp; } } ``` 3. 插入排序 ``` c void insertion_sort(int arr[], int n) { for (int i = 1; i < n; i++) { int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } } ``` 4. 希尔排序 ``` c void shell_sort(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; } } } ``` 5. 快速排序 ``` c void quick_sort(int arr[], int left, int right) { if (left < right) { int pivot = partition(arr, left, right); quick_sort(arr, left, pivot - 1); quick_sort(arr, pivot + 1, right); } } int partition(int arr[], int left, int right) { int pivot = arr[right]; int i = left - 1; for (int j = left; j < right; j++) { if (arr[j] < pivot) { i++; int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } int temp = arr[i + 1]; arr[i + 1] = arr[right]; arr[right] = temp; return i + 1; } ``` 6. 归并排序 ``` c void merge_sort(int arr[], int left, int right) { if (left < right) { int mid = left + (right - left) / 2; merge_sort(arr, left, mid); merge_sort(arr, mid + 1, right); merge(arr, left, mid, right); } } void merge(int arr[], int left, int mid, int right) { int i = left, j = mid + 1, k = 0; int temp[right - left + 1]; while (i <= mid && j <= right) { if (arr[i] < arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } for (int m = left, n = 0; m <= right; m++, n++) { arr[m] = temp[n]; } } ``` 7. 排序 ``` c void heap_sort(int arr[], int n) { for (int i = n / 2 - 1; i >= 0; i--) { heapify(arr, n, i); } for (int i = n - 1; i > 0; i--) { int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; heapify(arr, i, 0); } } void heapify(int arr[], int n, int i) { int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left < n && arr[left] > arr[largest]) { largest = left; } if (right < n && arr[right] > arr[largest]) { largest = right; } if (largest != i) { int temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp; heapify(arr, n, largest); } } ``` 8. 计数排序 ``` c void counting_sort(int arr[], int n) { int max = arr[0], min = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > max) { max = arr[i]; } if (arr[i] < min) { min = arr[i]; } } int count[max - min + 1]; memset(count, 0, sizeof(count)); for (int i = 0; i < n; i++) { count[arr[i] - min]++; } for (int i = 1; i < max - min + 1; i++) { count[i] += count[i - 1]; } int temp[n]; for (int i = n - 1; i >= 0; i--) { temp[--count[arr[i] - min]] = arr[i]; } for (int i = 0; i < n; i++) { arr[i] = temp[i]; } } ``` 9. 排序 ``` c void bucket_sort(int arr[], int n) { int max = arr[0], min = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > max) { max = arr[i]; } if (arr[i] < min) { min = arr[i]; } } int bucket_num = (max - min) / n + 1; int bucket[bucket_num][n]; int bucket_count[bucket_num]; memset(bucket_count, 0, sizeof(bucket_count)); for (int i = 0; i < n; i++) { int index = (arr[i] - min) / n; bucket[index][bucket_count[index]] = arr[i]; bucket_count[index]++; } int k = 0; for (int i = 0; i < bucket_num; i++) { if (bucket_count[i] > 0) { insertion_sort(bucket[i], bucket_count[i]); for (int j = 0; j < bucket_count[i]; j++) { arr[k++] = bucket[i][j]; } } } } ``` 10. 基数排序 ``` c void radix_sort(int arr[], int n) { int max = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > max) { max = arr[i]; } } for (int exp = 1; max / exp > 0; exp *= 10) { counting_sort_by_digit(arr, n, exp); } } void counting_sort_by_digit(int arr[], int n, int exp) { int count[10]; memset(count, 0, sizeof(count)); for (int i = 0; i < n; i++) { count[(arr[i] / exp) % 10]++; } for (int i = 1; i < 10; i++) { count[i] += count[i - 1]; } int temp[n]; for (int i = n - 1; i >= 0; i--) { temp[--count[(arr[i] / exp) % 10]] = arr[i]; } for (int i = 0; i < n; i++) { arr[i] = temp[i]; } } ``` 以上是C语言实现各种排序方法的代码示例,可以根据具体的需求进行选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值