算法_排序算法分析_笔记(一)
_排序算法分析
排序算法:通过调换位置让一组数据拥有某种次序关系的方法或规则。
1、排序算法特点
大多数排序算法包含两个基础操作:
(1)、比较两个数据元素的大小 -------------- 比较
(2)、改变指向数据的指针或移动数据本身 ---- 交换
对数据进行扩展 --- 数据 -->记录 --> 按关键值排序
-->对象---> 按属性排序
2、排序算法的分析 --- 尺
排序算法的分析一般从下面三个角度进行分析/欣赏:
A、算法稳定性 -- 排序算法是否为稳定的是由具体算法决定的。
通俗地讲就是能保证:2个相等的数其在排序前后的他们相对位置不变。
在简单形式化一下,如果Ai = Aj, Ai原来在Aj位置前,
排序后Ai还是要在Aj位置前。
B、算法的时间复杂度
如排序问题的规模大小(n),一般而言,好的性能是 O(nlogn)
且坏的性能是 O(n^2)。对于一个排序理想的性能是 O(n)。
C、算法的空间复杂度
如排序问题的规模大小(n),一般而言,排序算法空间复杂度为:O(1)或O(n)
3、排序算法的分类
为了达到排序的目的,对序列中的数据采用的动作有:比较、插入、交换、选择、合并等等。
根据排序算法采用主要动作,算法分类如下;
交换排序--- 包含冒泡排序、快速排序等;
插入排序--- 包含直接插入排序、希尔(shell)排序等;
选择排序--- 包括堆排序等。
C++ 实现常用的几种算法(冒泡排序,快速排序,直接插入排序,二分查找算法,递归算法)
sort.h
#include <iostream> using namespace std; void BubbleSort(int* pArray, int length); void QuickSort(int array[], int lowNum, int highNum); void InsertSort(int array[], int length); void printArray(int array[], int length); class student { public: virtual void test()=0 { cout<<"test"<<endl; } };
sort.cpp
#include "sort.h" //冒泡 void BubbleSort(int* pArray,int length) { for (int i=0;i< length-1;i++) { for (int j=0;j< length - i - 1;j++) { if (pArray[j] >pArray[j + 1]) { int temp = pArray[j]; pArray[j] = pArray[j + 1]; pArray[j + 1] = temp; } } } } //交换 void swap(int& num1, int& num2) { int tmp = num1; num1 = num2; num2 = tmp; } //快速排序 void QuickSort(int pArray[],int lowNum,int highNum) { //如果开始排序时,上下限范围相等,则返回 if(lowNum >= highNum) { return; } //新建左右 下标,初值为 上下限。 int left = lowNum; int right = highNum; //用left下标 对应的数组值 作为 关键值 int key = pArray[left]; //当左右 下标相等时,本趟比较结束 while(left < right) { //从右到左,找到第一个小于 key值的下标 while (left < right && pArray[right] >= key) { right--; } swap(pArray[right], pArray[left]); //从左到右,找到第一个大于 key值的下标 while (left < right && pArray[left] <= key) { left++; } swap(pArray[left], pArray[right]); } QuickSort(pArray, lowNum, left - 1); QuickSort(pArray, left + 1, highNum); } //直接插入排序 void InsertSort(int pArray[], int length) { for(int i = 1; i < length;i++) { //从当前被选取的元素位置开始,往前遍历,找到第一个比他小的元素 for(int j = i ; j > 0; j--) { if (pArray[j - 1] > pArray[j]) { int tmp = pArray[j - 1]; pArray[j - 1] = pArray[j]; pArray[j] = tmp; } else { break; } } } } void printArray(int array[], int n) { for (int i=0;i<n;i++) { cout<<array[i]<<"\t"; } cout<<endl; }