来自菜鸟的日程-------c语言基础篇18(排序2----快排,堆排)
2018-11-18 22:17
405 查看
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<assert.h>
//堆排:
void Adjust(int *arr,int start,int end) { int tmp = arr[start]; for(int i=2*start+1;i <= end;i = 2*i+1) { // 判断是否有右孩子 if (i < end && arr[i] <arr[i+1]) { i++; }//i为当前孩子的最大下标 if(arr[i] > tmp) { arr[start] = arr[i]; start = i; } else { break; } } arr[start] = tmp; } void HeapSort(int *arr,int len) { int i = 0; for(i = (len-1-1)/2;i >= 0;i--) { Adjust(arr,i,len-1); } //肯定是大根堆 //先交换,后调整(只需要调整0号下标这棵树) for(i = 0;i < len-1;i++) { int tmp = arr[0]; arr[0] = arr[len-1-i]; arr[len-1-i] = tmp; Adjust(arr,0,len-1-i-1); } }
快速排序:找基准的过程(递归)
每次可以均匀的分割待排序序列,快速排序会越来越快
三种排序方式:
1、固定位置选取基准法
2、随机选取基准法
3、三分取中法
两种优化:
1、如果待排序序列,在排序过程当中数据量变得很小时,用直接插入排序
2、聚集相同基准法
/*
时间复杂度:O(nlog2n)
空间复杂度:O(log2n)
不稳定
*/
//快排:
int Partion(int *arr,int low,int high) { int tmp = arr[low]; while(low < high) { while(low < high && arr[high] > tmp) { high --; } if(low >= high) { break; } else { arr[low] = arr[high]; } while(low < high && arr[low] < tmp) { low ++; } if(low >= high) { break; } else { arr[high] = arr[low]; } } arr[low] = tmp; return low; }
//递归版:
void Quick(int *arr,int start,int end) { int par = Partion(arr,start,end);//O(n) //左边 if(par > start + 1) { Quick(arr,start,par - 1);//log(2n) } //右边 if(par < end - 1) { Quick(arr,par + 1,end); } } void QuickSort(int *arr,int len) { Quick(arr,0,len-1); }
//非递归:
void QuickSort1(int *arr,int len) { //log2n int tmpSize = (int)log((double)len)/log((double)2); int *stack = (int*)malloc(sizeof(int)*tmpSize*2); assert(stack != NULL); int top = 0;// 数组的下标 int low = 0; int high = len-1; int par = Partion(arr,low,high);//第一次找完基准 if(par > low+1) { stack[top++] = low; stack[top++] = par-1; } if(par < high-1) { stack[top++] = par+1; stack[top++] = high; } while(top > 0) { high = stack[--top]; low = stack[--top]; par = Partion(arr,low,high); if(par > low+1) { stack[top++] = low; stack[top++] = par-1; } if(par < high-1) { stack[top++] = par+1; stack[top++] = high; } } free(stack); stack = NULL; } void Show(int *arr,int len) { for(int i = 0;i < len;i++) { printf("%d ",arr[i]); } printf("\n"); } int main() { int arr[] = {12,5,9,0,7,4,22,21,55,77,11}; int len = sizeof(arr) / sizeof(arr[0]); QuickSort(arr,len);//递归 //QuickSort1(arr,len);//非递归 //HeapSort(arr,len);//堆排 Show(arr,len); return 0; }
相关文章推荐
- Java语言程序设计-基础篇-编程练习4-18
- 选择排序的3种语言实现方法(C java python)
- javaScript菜鸟:学习js的Sort()排序的总结(参考大师示例)
- java语言基础篇-(第四课)常量和变量
- 黑马程序员——C语言基础篇---基础语法
- 黑马程序员——C语言基础篇---宏定义、数组、字符串和函数
- C语言排序之快速排序篇
- C语言实验——三个数排序 (sdut oj)
- 1.实现sql语言中DQL语言,实现简单查询、条件查询、排序查询等。
- Windows汇编语言简明教程——基础篇
- php基础篇-二维数组排序 array_multisort
- SQL 是一门美丽的语言 她来自艺术
- Android Studio NDK 入门教程(1)--来自C 语言的String
- docker 18.x - 基础篇-臧雪园-专题视频课程
- 【JAVA语言程序设计基础篇】--图形--使用FontMetrics类居中显示字符串
- 有关选择排序的小题目,本人菜鸟第一次发,请多多关照
- 【JAVA语言程序设计基础篇】--图形--一些练习
- .net学习笔记-C#语言基础篇2
- Java语言程序设计基础篇 循环(四)练习
- Java语言程序设计 【基础篇】 【学习笔记】