各种数组排序C版

各种数组排序C版

先看结论:

排序算法平均时间复杂度
冒泡排序O(N^2)
选择排序O(N^2)
插入排序O(N^2)
希尔排序O(N^1.5)
快速排序O(NlogN)
归并排序O(NlogN)
堆排序O(NlogN)
基数排序O(d(n+r))

冒泡排序

for(int i = 0 ; i < arr.size(); i++){
  for(int j = i+1; j < arr.size(); j++){
    if(arr[j - 1] > arr[j]){
      swap(arr[j], arr[j-1]);
    }
  }
}

选择排序

每次遍历,找到最小的数值与第一个元素交换

for(int i = 0; i < arr.size(); i++){
  int minIndex = i;
  for(int j = i + 1; j < arr.size(); j++){
    if(arr[j] < arr[minIndex]){
      minIndex = j;
    }
  }
  if(minIndex != i){
    swap(arr[i], arr[minIndex]);
  }
}

插入排序

for(int i= 0; i < arr.size(); i++){
  for(int j = i + 1; j > 0; j--){
    if(arr[j-1] > arr[j]){
     	swap[arr[j-1], arr[j]];
    }
    else
      break;
  }
}

希尔排序

根据某一增量分为若干子序列,并对子序列分别进行插入排序

快速排序

先寻找一个pivot,然后和pivot比大小,分成两堆。重复该过程直至每堆只有一个数字

void Qsort(int *arr, int left, int right){
  if(left >= right )
    return;
  int key = arr[left];
  int i = left;
  int j =right;
  while(i < j && a[j] >= key){
    j--;
  }
  if(i < j)
  {
    a[i] = a[j];
    i++;
  }
  
  while(i < j && a[i] < key ){
    i++;
  }
  if(i < j){
    a[j] = a[i];
    j--;
  }
  a[i] = key;
  Qsort(arr, left, i - 1);
  Qsort(arr, i + 1, right);
  
}

归并排序

Divide and conquer

关于STL中sort()

头文件下的sort方法很方便,实现原理是

sort里一共结合了三种算法:快速排序,插入排序,堆排序

reference

排序算法总结

[C++一道深坑面试题:STL里sort算法用的是什么排序算法?](

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,我们可以了解到快速排序算法和归并排序算法都是常见的排序算法,其中快速排序算法采用分治的思想,而归并排序算法则是将两个及其以上的有序表合并为一张有序表。下面是使用快速排序算法对n元数组进行排序的C语言代码示例: ```c #include <stdio.h> // 快速排序函数 void quick_sort(int arr[], int left, int right) { if (left >= right) { return; } int i = left, j = right, pivot = arr[left]; while (i < j) { while (i < j && arr[j] >= pivot) { j--; } arr[i] = arr[j]; while (i < j && arr[i] <= pivot) { i++; } arr[j] = arr[i]; } arr[i] = pivot; quick_sort(arr, left, i - 1); quick_sort(arr, i + 1, right); } int main() { int arr[] = {5, 8, 7, 6, 4, 3, 9}; int n = sizeof(arr) / sizeof(arr[0]); quick_sort(arr, 0, n - 1); printf("排序后的数组:"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; } ``` 上述代码中,我们定义了一个`quick_sort`函数来实现快速排序算法,其中`arr`表示待排序数组,`left`和`right`表示数组的左右边界。在函数中,我们首先判断左右边界是否相遇,如果相遇则返回;否则,我们选取数组的第一个元素作为基准数`pivot`,然后从右往左找到第一个小于`pivot`的数,从左往右找到第一个大于`pivot`的数,将这两个数交换位置,直到左右指针相遇。最后,我们将基准数放到相遇的位置上,然后递归地对基准数左右两边的子数组进行排序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值