1.快排序理论:
快速排序是一种平均时间性能非常好的方法。一般排序算法,每次循环之后只能减少一个数据量因此复杂度是O(N2),而快排序是选定基准元素,一般取第一个,每次安排完一个数据后还能将其余数据分成一组比它大和一组比它小的两组数据,按此方法,再依次分别对分好类的数据进行排序操作,下面以一组数据举例。
int arrIn[] = {36,34,67,44,8,6,9,45,87}
以第一项36为基准元素,
36 [ ], 34, 67, 44, 8, 6, 9, 45, 87
<--
36 [
9], 34, 67, 44, 8, 6, [ ], 45, 87
-->
36 [
9], 34, [ ], 44, 8, 6, [
67], 45, 87
<--
36 [
9], 34, [
6 ], 44, 8, [ ], [
67], 45, 87
-->
36 [ 9], 34, [6 ], [ ], 8, [ 44], [ 67], 45, 87
<--
36 [ 9], 34, [6 ], [8 ], [ ], [ 44], [ 67], 45, 87
--><--
左右指针相遇完成一次排序,将基准元素放到空余位置
第一次排序后的list为:
9 ,34 ,6 ,8 ,36 ,
44 ,67 ,45 ,87
第二次从左半部分开始:
8 ,6 ,9 ,34
第三次从左半部开始
6 ,
8 ,9 ,34
第四次从36的右半部开始,类似上面操作
。。。
最终排序结果
6 ,8 ,9 ,34 ,36 ,44 ,45 ,67 ,87
2.基于堆栈实现的快排序代码:
堆栈操作实现:
-
#ifndef _CPPSTACK_H_
-
#define _CPPSTACK_H_
-
/****** include *******/
-
#include <iostream>
-
#include <stdio.h>
-
/****** define *********/
-
/****** variable ********/
-
struct Item
-
{
-
int data;
-
Item* p_next;
-
};
-
-
class CPPStack
-
{
-
public:
-
CPPStack();
-
CPPStack(const CPPStack & otherStack);//constructor reset
-
CPPStack operator = (const CPPStack & otherStack);//'=' reset
-
void push(int x);//in stack
-
bool pop(int &x);//out stack
-
bool isEmpty();
-
void clearStack();
-
int sizeStack();
-
void printStack();
-
~CPPStack();
-
public:
-
Item* p_top;//stack top
-
};
-
/****** function *******/
-
#endif // _CPPSTACK_H_
快速排序算法实现:
-
#ifndef _QUICKSORT_H_
-
#define _QUICKSORT_H_
-
/****** include *******/
-
#include <iostream>
-
#include <stdio.h>
-
/****** define *********/
-
/****** variable ********/
-
-
/****** function *******/
-
bool quickSort(int* arrIN, int arrLength);
-
#endif // _QUICKSORT_H_
主函数:
-
#include "CPPStack.h"
-
#include "quickSort.h"
-
-
-
using namespace std;
-
-
int main()
-
{
-
int arrIn[] = {36,34,67,44,8,6,9,45,87};
-
quickSort(arrIn, sizeof(arrIn)/sizeof(int));
-
-
return 0;
-
}
3.总结
这次实现代码过程中遇到的问题
(1)遇到“segmentation fault”错误,段错误,经过查资料,知道是指针误操作导致,错误原因:程序中指针没有初始化就进行相应操作
(2)压栈操作压入数据异常,此处也属于指针操作错误,指针操作前应先初始化,C++ 用new关键字, C里面用malloc函数
使用实例:
new:
int *p = new int(10);
注意使用结束时使用delete释放:
delete p;
malloc:
void *malloc(long NumBytes)
char *charList = (char *)malloc(100 * sizeof(char));
注意使用结束时,使用free释放:
free(charList);
(3)快速排序是一种不稳定排序方法
阅读(2820) | 评论(0) | 转发(0) |