选择(select)排序算法

来源:互联网 发布:linux 批量删除文件夹 编辑:程序博客网 时间:2024/06/05 00:46

直接排序是不稳定的排序。

1、直接排序算法的基本思想

n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。

(1) 初始状态:无序区为A[1...n],有序区为空。

(2) 第一趟排序:在无序区A[1...n]中选出最小的记录A[k],将他与无序区的第一个记录A[1]交换,使A[1...1]和A[2...n]分别变为记录个数增加1的新有序区和记录个数减少1的新无序区。

(3)第i趟排序:第i趟排序开始时,当前有序区和无序区分别为A[1.,.i-1]和A[i...n](1<=i<=n-1)。该趟排序从当前无序区中选出关键字最小的记录A[K],将它与无序区的第一个记录A[I]交换,使A[1...n]和A[I+1...n]分别变为记录个数增加1的新有序区和记录个数减少1的新无序区。这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。直接选择排序是不稳定的排序算法。

2、思想

首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。具体做法是:选择最小的元素与未排序部分的首部交换,使得序列的前面为有序。

3、算法复杂度

最好情况下:交换0次,但是每次都要找到最小的元素,因此大约必须遍历N*N次,因此为O(N*N)。减少了交换次数

最坏情况下,平均情况下:O(N*N)

4、稳定性

 由于每次都是选取未排序序列A中的最小元素x与A中的第一个元素交换,因此跨距离了,很可能破坏了元素间的相对位置,因此选择排序是不稳定的!

5、代码实现

//编程实现选择排序//顾名思义,选择排序是无序区中选择最小的一个元素放在第一位置,次小的元素放到第二个位置。//1.选择第一个元素即a[0]为临时元素为最小,遍历后面的元素与之比较,只要出现比tempMin小的数a[j],将a[j]赋值给tempMin。//2.将第一个元素与后面最小元素的位置进行交换(a[l]=a[i]),最小元素放到第一个元素位置上。//3.重复上述操作,直至将整个数组遍历一遍,i=0;i<len-1,i++;内层循环为j=i+1;j<len;j++.#include<iostream>using namespace std;void select_sort(int a[], int len){int i,j,l, tempMin;for (i = 0; i < len-1; i++)<span style="white-space:pre"></span>//对0~len-2进行循环,进行len-1次{tempMin = a[i];//每次都取无序区的第一个数为临时最小数l = i;//记录临时最小数的下标(无序区第一个元素下标)for (j = i+1; j < len; j++)<span style="white-space:pre"></span>//从i+1的位置(临时最小数的后一位)向数组尾部进行遍历{if (a[j] < tempMin)//无序区+1到数组尾部有小于临时最小数{tempMin = a[j];//tempMin保存每次遍历搜索到的最小数l = j;//l记录最小数的位置}}a[l] = a[i];//把最小元素与a[i](无序区第一个元素)进行交换a[i] = tempMin;}}static void print_array(int a[], int len){for (int i = 0; i < len; i++)<span style="white-space:pre"></span>//打印数组{cout << a[i] << " ";}}void main9mianshiti5(){int a[] = { 54, 38, 96, 23, 15, 72, 60, 45, 83 };cout << "before select sort:";print_array(a, 9);select_sort(a, 9);//选择排序cout << "\nafter select sort:";print_array(a, 9);system("pause");}

6、测试结果

before select sort:54 38 96 23 15 72 60 45 83

after select sort:15 23 38 45 54 60 72 83 96

0 0
原创粉丝点击