苦于记不住八大排序?现成的模板它不香?

Posted 未央吖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了苦于记不住八大排序?现成的模板它不香?相关的知识,希望对你有一定的参考价值。

 -以下都是调用函数-遇到相关排序题直接套用即可

选择排序

void selection_sort(int arr[], int len) 

    int i,j;
 
    for (i = 0 ; i < len - 1 ; i++)         //进行len-1趟
    
        int min = i;                        //设为最小的
        for (j = i + 1; j < len; j++)     
            if (arr[j] < arr[min])    
                min = j;                    //找最小的
                int temp = arr[min];        //交换
                arr[min]= arr[i];
                arr[i] = temp;
               
    

冒泡排序

void bubble_sort(int a[],int n)//n为数组a的元素个数

    //一定进行N-1轮比较
    for(int i=0; i<n-1; i++)
    
        //每一轮比较前n-1-i个,即已排序好的最后i个不用比较
        for(int j=0; j<n-1-i; j++)
        
            if(a[j] > a[j+1])
            
                int temp = a[j];
                a[j] = a[j+1];
                a[j+1]=temp;
            
        
    

插入排序

void insert_sort(int a[],int n)//n为数组a的元素个数

    //进行N-1轮插入过程
    for(int i=1; i<n; i++)
    
        //首先找到元素a[i]需要插入的位置
        int j=0;
        while( (a[j]<a[i]) && (j<i))
        
            j++;
        
        //将元素插入到正确的位置
        if(i != j)  //如果i==j,说明a[i]刚好在正确的位置
        
            int temp = a[i];
            for(int k = i; k > j; k--)
            
                a[k] = a[k-1];
            
            a[j] = temp;
        
    

 希尔排序

int shsort(int s[], int n)    /* 自定义函数 shsort()*/

    int i,j,d;
    d=n/2;    /*确定固定增虽值*/
    while(d>=1)
    
        for(i=d+1;i<=n;i++)    /*数组下标从d+1开始进行直接插入排序*/
        
            s[0]=s[i];    /*设置监视哨*/
            j=i-d;    /*确定要进行比较的元素的最右边位置*/
            while((j>0)&&(s[0]<s[j]))
            
                s[j+d]=s[j];    /*数据右移*/
                j=j-d;    /*向左移d个位置V*/
            
            s[j + d]=s[0];    /*在确定的位罝插入s[i]*/
        
        d = d/2;    /*增里变为原来的一半*/
    
return 0;

快速排序

void Swap(int *p, int *q)         //交换函数

    int buf;
    buf = *p;
    *p = *q;
    *q = buf;
    return;

void QuickSort(int *a, int low, int high)

    int i = low;            //最小
    int j = high;           //最大
    int key = a[low];
    if (low >= high)  //如果low >= high说明排序结束了
    
        return ;
    
    while (low < high)  //该while循环结束一次表示比较了一轮
    
        while (low < high && key <= a[high])
        
            --high;  //向前寻找
        
        if (key > a[high])
        
            Swap(&a[low], &a[high]);
            ++low;
        
        while (low < high && key >= a[low])
        
            ++low;  //向后寻找
        
        if (key < a[low])
        
            Swap(&a[low], &a[high]);
            --high;
        
    
    QuickSort(a, i, low-1);  //用同样的方式对分出来的左边的部分进行同上的做法
    QuickSort(a, low+1, j);  //用同样的方式对分出来的右边的部分进行同上的做法

基数排序

int getDigitNum(int x) 
  if(x == 0) return 1; 
  int res = 0; 
  while(x) 
    res ++; 
    x /= 10; 
   
  return res; 
 
void RadixSort(int data[], int n) 
  //find the Maximum and its digit number 
  int Max = data[0]; 
  for(int i = 1; i < n; i++) 
    if(Max < data[i]) Max = data[i]; 
   
  int maxNum = getDigitNum(Max); 
  //maxNum times radix sort 
  int divisor = 1; 
  for(int k = 0; k < maxNum; k++) 
    vector<int> g[10];//g[i]中包含了"末位"数字是i的data[]数组中的元素 
    for(int i = 0; i < 10; i++) g[i].clear(); 
    for(int i = 0; i < n; i++) 
      int tmp = data[i] / divisor % 10; 
      g[tmp].push_back(data[i]); 
     
    int cnt = 0; 
    for(int i = 0; i < 10; i++) 
      for(int j = 0; j < g[i].size(); j++) 
        data[cnt++] = g[i][j]; 
       
     
    divisor *= 10; 
   
 

归并排序

void merges(int arr[], int low, int mid, int high)
    int i, k;
    int *tmp = (int *)malloc((high-low+1)*sizeof(int));
    //申请空间,使其大小为两个
    int left_low = low;
    int left_high = mid;
    int right_low = mid + 1;
    int right_high = high;

    for(k=0; left_low<=left_high && right_low<=right_high; k++)  // 比较两个指针所指向的元素
        if(arr[left_low]<=arr[right_low])
            tmp[k] = arr[left_low++];
        else
            tmp[k] = arr[right_low++];
        
    

    if(left_low <= left_high)  //若第一个序列有剩余,直接复制出来粘到合并序列尾
    //memcpy(tmp+k, arr+left_low, (left_high-left_low+l)*sizeof(int));
    for(i=left_low;i<=left_high;i++)
        tmp[k++] = arr[i];
    

    if(right_low <= right_high)
    //若第二个序列有剩余,直接复制出来粘到合并序列尾
    //memcpy(tmp+k, arr+right_low, (right_high-right_low+1)*sizeof(int));
        for(i=right_low; i<=right_high; i++)
            tmp[k++] = arr[i];
    

    for(i=0; i<high-low+1; i++)
        arr[low+i] = tmp[i];
    free(tmp);
    return;


void merge_sort(int arr[], unsigned int first, unsigned int last)
    int mid = 0;
    if(first<last)
        mid = (first+last)/2; /* 注意防止溢出 */
        /*mid = first/2 + last/2;*/
        //mid = (first & last) + ((first ^ last) >> 1);
        merge_sort(arr, first, mid);
        merge_sort(arr, mid+1,last);
        merges(arr,first,mid,last);
    
    return;

堆排序

void
heapAdjust(int n, int par)

    int tmp, pos, lc, rc;

    while (par <= n/2) 
        tmp = h[par]; //记录父母结点键值
        lc = par<<1;
        rc = lc+1;
        pos = par;
        //父母结点至多更新2次
        if (h[par] < h[lc]) 
            h[par] = h[lc];
            pos = lc;
        
        if (rc <= n && h[par] < h[rc]) 
            h[par] = h[rc];
            pos = rc;
        
        if (pos == par) //无更新即无需调整
            break;
        else
            h[pos] = tmp;
        par = pos; //假设这个位置的结点是“父母结点”
    


//创建堆
//规模为n的堆,对其父母结点,自底向上自右向左地调整堆
void
createHeap(int n)

    int i;

    for (i = n/2; i != 0; i--) 
        heapAdjust(n, i);
    


void
heapSort(int n)

    int ntimes = n;

    while (ntimes--) 
        printf("%d\\n", h[1]);
        h[1] = h[n];
        h[n--] = 0; //堆清零
        heapAdjust(n, 1);
    

看不懂?不会上面的模板?

友情请来我们的C语言排序的大佬

qsort函数

直接套用这个模板

调用函数

int cmp ( const void *a , const void *b )

return *(int *)a - *(int *)b;         从小到大的排序

int cmp ( const void *a , const void *b )

return *(int *)b - *(int *)a;        从大到小的排序

 放在主函数的内容

qsort(nums,numsSize,sizeof(int),cmp);

更多详情点击 https://www.cnblogs.com/syxchina/archive/2010/07/29/2197382.html

牛刀小试

注意注意!!力扣困难题来袭

 

没用qsort函数前

int maximumGap(int* nums, int numsSize) 
    if (numsSize < 2) 
        return 0;
    
    int exp = 1;
    int buf[numsSize];
    memset(buf, 0, sizeof(buf));
    int maxVal = INT_MIN;
    for (int i = 0; i < numsSize; ++i) 
        maxVal = fmax(maxVal, nums[i]);
    

    while (maxVal >= exp) 
        int cnt[10];
        memset(cnt, 0, sizeof(cnt));
        for (int i = 0; i < numsSize; i++) 
            int digit = (nums[i] / exp) % 10;
            cnt[digit]++;
        
        for (int i = 1; i < 10; i++) 
            cnt[i] += cnt[i - 1];
        
        for (int i = numsSize - 1; i >= 0; i--) 
            int digit = (nums[i] / exp) % 10;
            buf[cnt[digit] - 1] = nums[i];
            cnt[digit]--;
        
        memcpy(nums, buf, sizeof(int) * numsSize);
        exp *= 10;
    

    int ret = 0;
    for (int i = 1; i < numsSize; i++) 
        ret = fmax(ret, nums[i] - nums[i - 1]);
    
    return ret;


 用了qsort后

 

int cmp(int *a,int *v)

    return *a-*v;

int maximumGap(int* nums, int numsSize)
qsort(nums,numsSize,sizeof(int),cmp);       //qsort函数排序
int max=0;
if(numsSize<2)return 0;
for(int i=0;i<numsSize-1;i++)

  max=fmax(nums[i+1]-nums[i],max);        //fmax  C语言里的一种函数求最大
 
return max;

以上是关于苦于记不住八大排序?现成的模板它不香?的主要内容,如果未能解决你的问题,请参考以下文章

还在手动创建POJO吗?代码一键生成它不香吗?

JAVA里面的代码老是记不住怎么办

JMM模型和cpu线程模型的对八大原子操作的作用冯诺依曼计算机模型

大厂真题汇总jQuery+angular+react+vue!这波羊毛它不香?

八大排序算法总结

[数据结构]排序——八大排序