码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序(C++实现)

时间:2018-06-19 17:12:11      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:def   pre   ccf   partition   secure   span   tar   star   std   

 快速排序的基本实现

快速排序算法是一种基于交换的高效的排序算法,它采用了分治法的思想:

1、从数列中取出一个数作为基准数(枢轴,pivot)。

2、将数组进行划分(partition),将比基准数大的元素都移至枢轴右边,将小于等于基准数的元素都移至枢轴左边。

3、再对左右的子区间重复第二步的划分操作,直至每个子区间只有一个元素。

快排最重要的一步就是划分了。划分的过程用通俗的语言讲就是“挖坑”和“填坑”。

快速排序 实现一:

 1 int partition(int arr[], int left, int right)  //找基准数 划分
 2 {
 3     int i = left + 1 ;
 4     int j = right;
 5     int temp = arr[left];
 6 
 7     while(i <= j)
 8     {
 9         while (arr[i] < temp)
10         {
11             i++;
12         }
13         while (arr[j] > temp )
14         {
15             j--;
16         }
17         if (i < j)
18             swap(arr[i++], arr[j--]);
19         else i++;
20     }
21     swap(arr[j], arr[left]);
22     return j;
23 
24 }
25 
26 void quick_sort(int arr[], int left, int right) 
27 {
28     if (left > right)
29         return;
30     int j = partition(arr, left, right);
31     quick_sort(arr, left, j - 1);
32     quick_sort(arr, j + 1, right);
33 }

快速排序 实现方法二:

 1 void QuickSort(int array[], int start, int last)
 2 {
 3     int i = start;
 4     int j = last;
 5     int temp = array[i];
 6     if (i < j)
 7     {
 8         while (i < j)
 9         {
10             //
11             while (i < j &&  array[j]>=temp )
12                 j--;
13             if (i < j)
14             {
15                 array[i] = array[j];
16                 i++;
17             }
18 
19             while (i < j && temp > array[i])
20                 i++;
21             if (i < j)
22             {
23                 array[j] = array[i];
24                 j--;
25             }
26                         
27         }
28         //把基准数放到i位置
29         array[i] = temp;
30         //递归方法
31         QuickSort(array, start, i - 1);
32         QuickSort(array, i + 1, last);
33     }
34 }

快速排序 用C++函数模板实现

 1 template<typename T>
 2 void quicksort(T data[], int first, int last)
 3 {
 4     int lower = first + 1;
 5     int upper = last;
 6     swap(data[first], data[(first + last) / 2]);
 7     T bound = data[first];
 8     while (lower <= upper)
 9     {
10         while (data[lower] < bound)
11             lower++;
12         while (data[upper] > bound)
13             upper--;
14         if (lower < upper)
15             swap(data[lower++], data[upper--]);
16         else lower++;
17     }
18     swap(data[upper], data[first]);
19     if (first < upper - 1)
20         quicksort(data, first, upper - 1);
21     if (upper + 1 < last)
22         quicksort(data, upper + 1, last);
23 }
24 
25 template<class T>
26 void quicksort(T data[], int n)
27 {
28     int i, max;
29     if (n < 2)
30         return;
31     for (i = 1, max = 0; i < n; i++)
32         if (data[max] < data[i])
33             max = i;
34     swap(data[n - 1], data[max]);
35     quicksort(data, 0, n - 2);  //  
36 }

快速排序  主函数测试代码

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <time.h>
using namespace std;

void PrintArray(int array[], int len)
{
    for (int i = 0; i < len; i++)
    {
        cout << array[i] << " ";
    }
    cout << endl;
}

int main(void)
{
    const int NUM = 10;
    int array[NUM] = { 0 };
    srand((unsigned int)time(nullptr));
    for (int i = 0; i < NUM; i++)
    {
        array[i] = rand() % 100 + 1;
    }
    cout << "排序前:" << endl;
    PrintArray(array, NUM);
    cout << "排序后:" << endl;
    quicksort(array, 0, NUM - 1);
        PrintArray(array, NUM);

    return 0;
}    

 

快速排序(C++实现)

标签:def   pre   ccf   partition   secure   span   tar   star   std   

原文地址:https://www.cnblogs.com/miracleswgm/p/9199124.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!