用了引用 在c++环境中调试
其实不稳定算法常见的只有四个,大家只要把这四个记住了。剩下的可以认为都是稳定的。
不稳定算法记忆口诀 “快些选队” 快:快速排序 些:希尔排序 选:选择排序 队:堆排序
#include<stdio.h>
#define MaxSize 20 //顺序表最大长度
typedef int KeyType; //typedef定义关键字类型为(int)
typedef int InfoType;
typedef struct
{
KeyType key; //关键字项
InfoType otherinfo; //其他数据项
}RedType;
typedef struct
{
RedType r[MaxSize + 1]; //r[0]闲置或做哨兵单元
int length; //顺序表的长度
}SqList; //顺序表类型
//直接选择排序
void selectSort(SqList &s) {
int i,k,j;
for (i = 1; i < s.length;i++) {
k = i;
for (j = i + 1; j <= s.length;j++) {
if (s.r[j].key<s.r[k].key) {
k = j;
}
}
if (k != i) {
s.r[0] = s.r[i];
s.r[i] = s.r[k];
s.r[k] = s.r[0];
}
}
}
int main()
{
SqList L;
L.length = 10;
L.r[1].key = 45;
L.r[2].key = 53;
L.r[3].key = 18;
L.r[4].key = 49;
L.r[5].key = 36;
L.r[6].key = 76;
L.r[7].key = 13;
L.r[8].key = 97;
L.r[9].key = 36;
L.r[10].key = 32;
for (int i = 1; i <= L.length; i++)
printf("%d ", L.r[i].key);
printf("\n");
selectSort(L);
for (int i = 1; i <= L.length; i++)
printf("%d ", L.r[i].key);
}
JAVA 实现
//直接排序
public class ZhiJieSort {
static void selectSort(List<Integer> list) {
int h = list.size();
int k = 0;
int tem = 0;
for (int i = 0; i < h - 1; i++) {
k = i;
tem = list.get(i);
for (int j = i + 1; j < h; j++) {
if (list.get(j) < list.get(k)) {
k = j;
}
}
//正确的赋值
if (i != k) {
list.set(i, list.get(k));
list.set(k, tem);//k值给正确的值
}
}
}
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(0, 45);
list.add(1, 36);
list.add(2, 72);
list.add(3, 18);
list.add(4, 53);
list.add(5, 31);
list.add(6, 48);
list.add(7, 36);
System.out.println("直接选择排序:");
System.out.println("排序前:");
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
System.out.println();
selectSort(list);
System.out.println("排序后:");
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
}
}