插入排序、选择排序的实现与性能比较

SortTestHelper.h

 1 #ifndef INSERTIONSORT_SORTTESTHELPER_H
 2 #define INSERTIONSORT_SORTTESTHELPER_H
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <string>
 6 #include <ctime>
 7 #include <cassert>
 8
 9 using namespace std;
10
11 //辅助排序测试
12 namespace SortTestHelper{
13
14     //生成有n个元素的随机数组,每个元素的随机范围为[rangL,rangR]
15     int* generateRandomArray(int n,int rangL,int rangR){
16         //默认rangL要小于rangR
17         assert(rangL <= rangR );
18         int* arr = new int[n];
19
20         //设置随机种子:将当前时间作为种子来进行随机数的设置
21         srand(time(NULL));
22
23         for (int i = 0; i < n; i++)
24             //惯用的随机数生成式,生成一个范围在rangL---rangR的随机数
25             arr[i] = rand() % (rangR - rangL + 1) + rangL;
26         return arr;
27     }
28
29     //打印函数,用来打印各种类型下的数组
30     template<typename T>
31     void printArray(T arr[],int n){
32         for (int i = 0; i < n; i++)
33             cout << arr[i] << " ";
34         cout << endl;
35         return 0;
36     }
37
38     //经过排序算法排序后,再次确认是否已经完全排序
39     template<typename T>
40     bool isSorted(T arr[], int n) {
41
42         for (int i = 0; i < n - 1; i++)
43         if (arr[i] > arr[i + 1])
44             return false;
45
46         return true;
47     }
48
49     //衡量一个算法的性能如何,最简单的方式就是看这个算法在特定数据集上的执行时间
50     //(1)传入排序算法的名字,方便打印输出
51     //(2)传入排序算法本身,即函数指针
52     //(3)传入测试用例:数组和元素个数
53     template<typename T>
54     void testSort(const string &sortName, void(*sort)(T[], int), T arr[], int n){
55
56         //在排序前后分别调用clock()函数
57         //时间差就是该排序算法执行的时钟周期的个数
58         clock_t startTime = clock();
59         sort(arr,n);
60         clock_t endTime = clock();
61
62         //判断是否有序,不有序则直接退出
63         assert(isSorted(arr,n));
64
65         //endTime 减去 startTime 转为double类型,除以 CLOCKS_PER_SEC,其中:
66         //CLOCKS_PER_SEC 是标准库中定义的一个宏,表示每一秒钟所运行的时钟周期
67         //的个数,而(endTime-startTime)返回的是运行了几个时钟周期
68         //这样,最终的结果就是在这段时间中程序执行了多少秒
69         cout << sortName << ":" << double(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;
70         return;
71     }
72
73     //拷贝数组函数
74     int *copyIntArray(int a[],int n){
75         int *arr = new int[n];
76         //copy()函数在命名空间std中:
77         //第一个参数是原数组的头指针,
78         //第二个参数是原数组的尾指针,
79         //第三个参数是目的数组的头指针
80
81         //注意:copy()函数运行时会报错,需要在:
82         //项目->属性->配置属性->C/C++->预处理器->预处理器定义
83         //在其中添加:_SCL_SECURE_NO_WARNINGS
84         copy(a,a+n,arr);
85         /*for (int i = 0; i < n; i++)
86             arr[i] = a[i];*/
87         return arr;
88     }
89 }
90
91 #endif

SelectionSort.h

 1 #ifndef INSERTION_SELECTIONSORT_H
 2 #define INSERTION_SELECTIONSORT_H
 3
 4 //选择排序
 5 template<typename T>
 6 void selectionSort(T arr[], int n){
 7
 8     for (int i = 0; i < n; i++){
 9
10         int minIndex = i;
11         for (int j = i + 1; j < n; j++)
12         if (arr[j] < arr[minIndex])
13             minIndex = j;
14
15         swap(arr[i], arr[minIndex]);
16     }
17 }
18
19 #endif

InsertionSort.h

 1 #ifndef INSERTIONSORT_INSERTION_H
 2 #define INSERTIONSORT_INSERTION_H
 3
 4 //插入排序
 5 template<typename T>
 6 void insertionSort(T arr[], int n){
 7     for (int i = 0; i < n; i++){
 8         for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--)
 9             swap(arr[j], arr[j - 1]);
10     }
11
12     //写法2:
13     //for (int j = i; j > 0; j--)
14     //{
15     //    if (arr[j] < arr[j - 1])
16     //    {
17     //        swap(arr[j], arr[j - 1]);
18     //    }
19     //    else
20     //    {
21     //        //当arr[i]插入到合适位置后,就跳出当前循环
22     //        //继续对下一个元素进行考察
23     //        break;
24     //    }
25     //}
26
27 }
28
29 #endif

main.cpp

 1 #include <iostream>
 2 #include <algorithm>
 3 #include "SortTestHelper.h"
 4 #include "InsertionSort.h"
 5 #include "SelectionSort.h"
 6 using namespace std;
 7
 8 int main(){
 9     int n = 10000;
10     int *arr = SortTestHelper::generateRandomArray(n,0,n);
11     int *arr2 = SortTestHelper::copyIntArray(arr,n);
12
13     //对同一数组进行插入排序所用时间:
14     SortTestHelper::testSort("Insertion Sort",insertionSort,arr,n);
15     //对同一数组进行选择排序所用时间:
16     SortTestHelper::testSort("Selection Sort", selectionSort, arr2, n);
17
18     delete[] arr;
19     delete[] arr2;
20     return 0;
21 }
时间: 2024-12-22 15:10:40

插入排序、选择排序的实现与性能比较的相关文章

插入排序,选择排序

1.插入排序 4 2 5 1 6 3 选定4, [0,0]这个区间是已处理的有序区间 现在遍历[1,5]这个区间,逐渐插入已处理的有序区间 把2拿出来 与[4]比较,发现<4 ,把4挪到它后面的位置处 _ 4 5 1 6 3 考察之前的4所在的位置0位是不是应该插入的地,2与这个预插入位置之前的元素比较,发现已经到头 所以0位是2正确插入的位置 插入后 2 4 5 1 6 3 然后考察5 把5挖出来,看下5是否能放在2这个位置,需要和2位置前面的元素比较 发现5>前面的元素4,所以5 放进2这

数组排序-冒泡排序-插入排序-选择排序-Java实现

package org.lyk.entities; public class SortHelper { public static void BubbleSort(int[] array) { for(int i = array.length-1; i >= 1 ; i--) { for(int j = 0; j < i ; j++) { if(array[j] > array[j+1]) { int temp = array[j]; array[j] = array[j+1]; arr

冒泡排序,插入排序,选择排序

""" 遍历数组 交换旗帜变量 = 假 (False) 从 i = 1 到 最后一个没有排序过元素的指数 如果 左边元素 > 右边元素 交换(左边元素,右边元素) 交换旗帜变量 = 真(True) """ def bubble_sort(arr): for i in range(len(arr)): flag = False for j in range(len(arr)-i-1): if arr[j] > arr[j+1]: arr

排序算法-冒泡排序(改),选择排序

上次说冒泡排序留下2个问题,一个是选择排序,一个是冒泡排序性能,这次会先说选择排序,然后说冒泡排序的优化 一选择排序 选择排序是一种简单直观的排序算法.它的工作原理是每一次从待排序的元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 流程: (有小到大排序) 第一轮 将0位元素与后续所有元素比较,将小的元素放在0位 第二轮 将1位元素与后续所有元素比较,将小的元素放在1位 ... 直到最后一位 代码上次已经贴出,这里复制下 1 public static vo

算法 排序lowB三人组 冒泡排序 选择排序 插入排序

参考博客:基于python的七种经典排序算法   [经典排序算法][集锦]     经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性: 经过某种排序后,如果两个记录序号同等,且两者在原无序记录中的先后秩序依然保持不变,则称所使用的排序方法是稳定的,反之是不稳定

Java实现冒泡排序,选择排序,插入排序

冒泡排序: 思想: 冒泡排序重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说排序完成 特点:比较稳定,排序数较小是比较好 package cn.guangboyuan; /** * @author Red Ants * 微信公众号:程序员之路 * 两种冒泡排序的性能比较 */ public class DubbleSort { private static boolean checkArray(int[] da

排序系列之——冒泡排序、插入排序、选择排序

排序之——冒泡排序: 基本思想:假设待排序表长为N,从后往前(或者从前往后)两两比较相邻元素的值,若为逆序(arr[i-1]>arr[i]),则交换他们,直到序列比较完.这时一趟冒泡. 代码如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <time.h> 5 #define N 20 6 7 void print_Arr(int *arr,

排序 之 冒泡排序 简单选择排序 直接插入排序 希尔排序

排序的基本概念 假设含有n个记录的序列为{r1,r2,--,rn},其相应的关键字分别为{k1,k2,--,kn},需确定1,2,--,n的一种排序p1,p2,--,pn,使其相应的关键字满足kp1≤kp2≤--≤kpn非递减(或非递增)关系,即使得序列称为一个按关键字有序的序列{rp1,rp2,--,rpn},这样的操作就称为排序. 排序的稳定性 假设ki=kj(1≤i≤n,1≤j≤n,i≠j),且在排序前的序列中ri领先于rj(即i<j).如果排序后ri仍领先于rj,则称所用的排序方法是稳定

排序(二)__冒泡排序、简单选择排序和直接插入排序

前面<排序(一)__综述>提到按照算法的复杂度分为简单算法和改进算法两大类,本文主要就简单算法中的冒泡排序.简单选择排序和直接插入排序进行通俗详细的解析. 一.冒泡排序 1.基本概念 冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止.(动态图来自维基百科) 2.关键代码(优化之后) void BubbleSort(SqList *L) { int i,j; Status flag=TRUE;            //flag用作标记,避