稳定性:快速 希尔 选择 堆排序不稳定

时间复杂度:平均情况下,快速、希尔、归并和堆排序的时间复杂度均为O(nlog2(n)),其他都是O(n^2)。最坏情况下,快排的时间复杂度为O(n^2)

 #include <iostream>
#include <stdlib.h>
#include <time.h>
#define N 1000
using namespace std; //输出
void output(int a[], int num){
for(int i=;i<num;i++){
cout<<a[i]<<" ";
}
cout<<endl;
} //交换元素位置
void swap(int a[], int index1, int index2){
int tmp = a[index1];
a[index1] = a[index2];
a[index2] = tmp;
} //快速排序
void quickSort(int a[], int l, int r, int num){
if(l<r){
int left = l;
int right = r;
int tmp = a[l];
while(left<right){
while(left<right && a[right]>=tmp){
right--;
}
if(left<right){
a[left++] = a[right];
}
while(left<right && a[left]<=tmp){
left++;
}
if(left<right){
a[right--] = a[left];
}
}
a[left] = tmp;
//output(a,num);
quickSort(a,l,left-,num);
quickSort(a,left+,r,num);
}
} //冒泡排序
void bubbleSort(int a[], int num){
int i,j;
int flag = ;
for(i=num-;i>;i--){
flag = ;
for(j=;j<i;j++){
if(a[j]>a[j+]){
swap(a,j,j+);
flag=;
}
}
if(flag==){
break;
}
}
} //选择排序
void selectSort(int a[], int num){
int right,i;
int maxIndex;
for(right=num-;right>;right--){
maxIndex = ;
for(i=;i<right;i++){
if(a[maxIndex]<a[i]){
maxIndex = i;
}
}
swap(a,maxIndex,right);
} } //建立大顶堆
void buildHeap(int a[], int index, int len){
int curParent = a[index];
int child = index * +;
while(child<len){
if(child+<len && a[child]<a[child+]){
child++;
}
if(curParent < a[child]){
a[index] = a[child];
//这里不用把curParent赋值给child,因为还要迭代子树,如果孩子中有更大的,会上移,curParent还要继续下移
index = child;
child = child * +;
} else {
break;
}
}
a[index] = curParent;
} /*
void buildHeap(int a[], int i, int len){
int parent = a[i];
int left = i*2+1;
while(child < len){
if(child+1<len && a[child]<a[child+1]){
child++;
}
if(parent<a[child]){
a[i] = child;
child = 2*i+1;
} else {
break;
}
}
a[p] = parent;
}*/ //堆排序
void heapSort(int a[], int num){
int i;
for(i=num/-;i>=;i--){
buildHeap(a, i, num);
}
for(i=num-;i>=;i--){
int max = a[];
a[] = a[i];
a[i] = max;
buildHeap(a,,i);
} }
//插入排序
void insertSort(int a[], int num){
int i,j,tmp;
for(i=;i<num;i++){
tmp = a[i];
for(j=i-;j>=;j--){
if(a[j]>tmp){
a[j+] = a[j];
} else {
break;
}
}
a[j+] = tmp;
}
} void merge(int a[], int first, int mid, int last){
int *tmp = (int *)malloc((last-first+)*sizeof(int));
int i = first;
int j = mid+;
int k = ;
while(i<=mid && j<=last){
if(a[i]<=a[j]){
tmp[k++] = a[i++];
} else {
tmp[k++] = a[j++];
}
}
while(i<=mid){
tmp[k++] = a[i++];
}
while(j<=last){
tmp[k++] = a[j++];
}
for(i=first;i<=last;i++){
a[i] = tmp[i-first];
}
free(tmp);
} void mergeSort(int a[], int first, int last){
int mid = (first+last)/;
if(first<last){
mergeSort(a,first,mid);
mergeSort(a,mid+,last);
merge(a,first,mid,last);
}
} int main(){
int num;
while(cin>>num){
int i;
start = clock();
int *arr = new int[num];
for(int i=; i<num; i++){
arr[i] = rand()%;
//cin>>arr[i];
}
cout<<"待排序数组为:"<<endl;
output(arr,num); //quickSort(arr,0,num-1,num); //快速排序
//bubbleSort(arr,num); //冒泡排序
//selectSort(arr,num); //归并排序
//insertSort(arr,num); //插入排序
//heapSort(arr,num); //堆排序
//mergeSort(arr,0,num-1); //归并排序
stop = clock();
cout<<stop-start<<endl; cout<<"排序后的数组为:"<<endl;
output(arr,num); }
return ;
}

C++实现排序算法的更多相关文章

  1. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  2. 排序算法----基数排序(RadixSort(L))单链表智能版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  3. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  4. 几大排序算法的Java实现

    很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...

  5. 排序算法----基数排序(RadixSort(L,max))单链表版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  6. 排序算法汇总(C/C++实现)

    前言:     本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...

  7. 用Java来写常见的排序算法

    随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * ...

  8. 模板化的七种排序算法,适用于T* vector<T>以及list<T>

    最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...

  9. 排序算法总结第二弹----冒泡排序---javascript描述

    上篇博文总结了选择排序,这篇来看冒泡排序,接上篇. 冒泡排序思想:若是正再将一组数据升序排序, 第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后 ...

  10. 排序算法总结------选择排序 ---javascript描述

    每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...

随机推荐

  1. chrome 调试工具的使用

    Elements chrome devtools 中 Elements panel 是审查 dom 元素和 css 的, 可以实时修改 dom/css. windows: ctrl + shift + ...

  2. 用java创建UDF,并用于Hive

    典型代码如下: 导入UDF类: import org.apache.hadoop.hive.ql.exec.UDF; public class UpperCassUDF extends UDF{ pu ...

  3. 记unit of work与事务提交

    https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/getting-started-with-ef-5-using- ...

  4. 系统调用方式文件编程-open

    通过Linux系统调用函数编写应用程序,该应用程序实现文件的复制功能 文件描述符--在Linux系统中,所有打开的文件也对应一个数字,这个数字由系统来分配. 1.打开文件--open 头文件:#inc ...

  5. android通过 Intent 传递类对象

    Android中Intent传递类对象提供了两种方式一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象. 要求被传递的对象必须实现上述2种接口中的一种 ...

  6. 详解Windows Service Wrapper(winsw.exe)及应用场景

    winsw.exe可以帮助nginx作为windows服务自启动,不需要每次都输入命令,很方便,使用到目前为止这种做法的效果很完美.你得到了 Windows 服务的支持,而且在服务重启时没有遗留孤立的 ...

  7. 2018.10.18 NOIP训练 01矩阵(组合数学)

    传送门 组合数学好题. 题目要求输出的结果成功把概率转化成了种类数. 本来可以枚举统计最小值为iii时的概率. 现在只需要统计最小值为iii时的方案数,每一行有不少于iii个1的方案数. 显然一行选i ...

  8. C++之类和对象的使用(二)

    析构函数 析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一系列清理工作,使这部分内存可以被程序分配给新对象使用.对象生命周期结束,程序就自动执行析构函数来完成这些工作. 析构函数是一种 ...

  9. IntelliJ IDEA 2017版 SpringBoot的关闭自动配置和自定义Banner

    一.关闭自动配置 在jar包下找下边的名字    设置关闭自动配置jar    多个的时候配置       二.自定义Banner   (1)网站搜索一个图案.网址:http://patorjk.co ...

  10. @media screen

    参考地址: http://www.swordair.com/blog/2010/08/431/ http://ashaochangfu.blog.163.com/blog/static/1042517 ...