冒泡排序、快速排序、

    xiaoxiao2022-07-13  133

    冒泡排序

    每次冒泡,把一个最大的数挤到无序部分的最后去。

    如果遍历整个无序区间期间时,一次交换都没发生说明无序区间是有序的

    void BubbleSort(int array[], int size) { for (int i = 0; i < size; i++) { int isSorted = 1; for (int j = 0; j < size - 1 - i; j++) { if (array[j] > array[j + 1]) { Swap(array, j, j + 1); isSorted = 0; } } if (isSorted == 1) { return; } } }

    最好情况:时间复杂度O(n)

    最坏情况:O(n^2)

    空间复杂度O(1)

    冒泡排序是一种稳定的排序算法

    快速排序

    任取待排序元素序列中的某元素作为基准值,按照排序码将待排序集合分割成两子序列,左子序列所有元素均小于基准值,右子序列中所有元素均大于基准值,左右子序列重复该过程,直到所有元素都排列在相应的位置上。

    按照基准值将区间分成左右子序列

    void _QuickSort(int array[],int low,int high) { //区间长度为0, if (low > high) { return; } //区间长度为1,表示区间内数已经有序 if (low == high) { return; } //找基准值,选最左边,基准值下边是low //遍历整个区间,小的放左,大的放右,返回基准值所在下标 int pivotIdx = Partition_3(array, low, high); //分治算法,分别处理两个区间 _QuickSort(array, low, pivotIdx-1); _QuickSort(array, pivotIdx + 1, high); }

    将区间按照基准值划分为左右两半部分的常见方式:

    hoare版本

    int Partition_1(int array[], int low, int high) { int begin = low;//begin从low开始 int end = high; int pivot = array[low]; while (begin < end) { //如果基准值放在左边,需要从右边开始走 while (begin<end&&array[end] >= pivot) { end--; } if (begin == end) { return; } while (begin < end&&array[begin] <= pivot) { begin++; } Swap(array, begin, end); } Swap(array, low, begin); return begin; }

    挖坑法

    int Partition_2(int array[], int low, int high) {//挖坑法 int begin = low;//begin从low开始 int end = high; int pivot = array[low];//坑的下标是begin while (begin < end) { //如果基准值放在左边,需要从右边开始走 while (begin<end&&array[end] >= pivot) { end--; } array[begin] = array[end]; while (begin < end&&array[begin] <= pivot) { begin++; } array[end] = array[begin]; } array[begin] = pivot; return begin; }

    前后下标法

    int Partition_3(int array[], int low, int high) { int d = low + 1; int i = low + 1; int pivot = array[low]; while (i < high) { if (array[i] < pivot) { Swap(array, d, i); d++; } i++; } Swap(array, d - 1, low); return d - 1; }

    归并排序

    void Merge(int array[], int left, int mid, int right,int extra[]) { int i = left; int j = right; int k = 0;//extra的下标 while (i < mid&&j < right) { if (array[i] < array[j]) { extra[k++] = array[i++]; } else { extra[k++] = array[j++]; } } while (i < mid) { extra[k++] = array[i++]; } while (j < right) { extra[k++] = array[j++]; } for (int x = left; x < right; x++) { array[x] = extra[x]; } } void _MergeSort(int array[], int left, int right,int extra[]) { if (right == left + 1) { return; } if (right <= left) { return; } int mid = left + (right - left) / 2; _MergeSort(array,left,mid,extra); _MergeSort(array,mid,right,extra); Merge(array, left, mid, right,extra); } void MergeSort(int array[], int size) { int *extra = (int*)malloc(sizeof(int)*size); _MergeSort(array, 0, size,extra); free(extra); }

     

    最新回复(0)