首页 > 其他 > 详细

基础数据结构算法总结

时间:2014-04-25 07:36:32      阅读:572      评论:0      收藏:0      [点我收藏+]

对本科使用的数据结构课本感情很深, 当初学的时候, 并不需要上机编程, 考试时只需写出伪代码即可. 而今, 实现的细节已经变得必须了, 所以, 再次拿出课本, 复习一下实现细节

 

数据结构和算法

1. 堆的实现(插入, 删除, 初始化, 以最大根为例) 

2. 快排的实现

3. 归并排序的实现

4. 数组实现队列

 

1. 堆的实现, 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
template <class T>
class MaxHeap {
public:
    MaxHeap(int MaxHeapSize = 10);
    ~MaxHeap(delete [] heap);
 
    int Size() const {
        return CurrentSize;
    }
 
    T Max() const {
        if(CurrentSize == 0)
            return OutOfBounds();
        return heap[1];
    }
 
    MaxHeap<T>& Insert(const T &x);
    MaxHeap<T>& Delete(T &x);
 
    void Initialize(T a[], int size, int ArraySize);
 
private:
    int CurrentSize, MaxSize;
    T *heap;
};
 
template <class T>
MaxHeap<T>::MaxHeap(int MaxHeapSize) {
    MaxSize = MaxHeapSize;
    CurrentSize = 0;
    heap = new T[MaxHeapSize+1];
}
 
template <class T>
MaxHeap<T>& MaxHeap<T>::Insert(const T &x) {
    if(CurrentSize == MaxSize) throw NoMem();
 
    int i = ++ CurrentSize;
 
    while(i != 1 && x > heap[i/2]) {
        heap[i] = heap[i/2];
        i /= 2;
    }
 
    heap[i] = x;
    return *this;
}
 
template <class T>
MaxHeap<T>& MaxHeap::Delete(T &x) {
    if(CurrentSize == 0) return OutOfBounds();
 
    x = heap[1];
 
    T y = heap[CurrentSize--];
 
    int i = 1, ci = 2*i;
 
    while(ci <= CurrentSize) {
        if(ci < CurrentSize && heap[ci] < heap[ci+1])
            ci ++;
 
        if(y >= heap[ci]) break;
 
        heap[i] = heap[ci];
 
        i = ci;
        ci *= 2;
    }
    heap[i] = y;
 
    return *this;
}
 
template <class  T>
void MaxHeap<T>::Initialize(T a[], int size, int ArraySize) {
    delete [] heap;
    heap = a;
    CurrentSize = size;
    MaxSize = ArraySize;
 
    for(int i = CurrentSize/2; i >= 1; i --)  {
        T y = heap[i];
 
        int c= 2 * i;
 
        while(c <= CurrentSize) {
            if(c < CurrentSize && heap[c] < heap[c+1])
                c ++;
            if(y >= heap[c]) break;
 
            heap[c/2] = heap[c];
            c *= 2;
        }
        heap[c/2] = y;
    }
}

  

2. 快排的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
template <class T>
void QuickSort(T *a, int n)  {
    quickSort(a, 0, n-1);
}
 
template <class T>
void quickSort(T *a, int l, int r)  {
    if(l >= r) return;
 
    int i = l; j = r+1;
    T pivot = a[i];
 
    // it should be aware that replace T[i] < pivot to T[i] <= pivot
    // the correctness of program can be remained
 
    while(true)  {
        do  {
            i = i + 1;
        while(T[i] < pivot);
         
        do  {
            j = j - 1;
        while(T[j] > pivot);
 
        if(i >= j) break;
 
        swap(T[i], T[j]);
    }
 
    a[l] = a[j];
    a[j] = pivot;
 
    quickSort(T, l, j-1);
    quickSort(T, j+1, r);
}

  

3. 归并排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
template <class T>
void MergeSort(T a[], int n)  {
    T *b = new T[n];
 
    int seg = 1; // the size of segment
    while(seg < n)  {
        MergePass(a, b, seg, n);
        seg ++;
        MergePass(b, a, seg, n);
    }
    delete []b;
}
 
template <class T>
void MergePass(T a[], T b[], int seg, int n)  {
    int i = 0;
 
    while(i < n - 2*seg)  {
        Merge(a, b, i, i+seg-1, i+2*seg-1);
        i += 2*seg;
    }
 
    if(i < n - seg)  {
        Merge(a, b, i+seg-1, n-1);
    else  {
        for(int j = i; j <= n-1; j ++)
            b[j] = a[j];
    }
}
 
template <class T>
void Merge(T a[], T b[], int l, int m, int r)  {
    int i = l, j = m+1, k = l;
 
    while(i <= m && j <= r)  {
        if(a[i] < b[j])  {
            b[l++] = a[i++];
        else  {
            b[l++] = b[j++];
        }
    }
 
    while(i < m)  {
        b[l++] = a[i++];
    }
    while(j < m)  {
        b[l++] = b[j++];
    }
}

  

4. 数组实现队列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
template <class T>
class Queue {
public:
    Queue(int MaxQueueSize = 10);
    ~Queue() {
        delete []queue;
    }
 
    bool IsEmpty() const {
        return (front == rear);
    }
    bool IsFull() const {
        return (rear+1)%MaxSize == front ? 1:0;
    }
 
    T First() const;
    T Last() const;
 
    Queue<T>& Add(const T &x);
    Queue<T>& Delete();
 
private:
    int front;
    int rear;
    int MaxSize;
    T *queue;
};
 
template <class T>
Queue<T>::Queue(int MaxQueueSize) {
    MaxSize = MaxQueueSize + 1;
    queue = new T[MaxSize];
    front = rear = 0;
}
 
template <class T>
T Queue<T>::First() const {
    if(IsEmpty()) throw OutOfBounds();
    return queue[(front+1)%MaxSize];
}
template <class T>
T Queue<T>::Last() const {
    IsFull(IsEmpty()) throw OutOfBounds();
    return queue[rear];
}
 
template<class T>
Queue<T>& Queue::Add(const T &x) {
    if(IsFull()) throw NoMem();
    rear = (rear+1) % MaxSize;
    queue[rear] = x;
    return *this;
}
template <class T>
Queue<T>& Queue::Delete() {
    if(IsEmpty()) throw OutOfBounds();
    front = (front+1) % MaxSize;
    x = queue[front];
    return *this;
}

  

基础数据结构算法总结,布布扣,bubuko.com

基础数据结构算法总结

原文:http://www.cnblogs.com/zhouzhuo/p/3684420.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!