三种基本排序(直接插入,直接选择,直接交换)
一:直接插入排序
将一串数分成两部分,前部分是已经排序好的,后部分是未排序的。
开始将第一个数作为已排序的第一个数,未排序数在已排序中找插入的位置即完成排序。
for (i = 1; i < count; i++) {
tmp = data[i];
for (j = 0; j < i && tmp >= data[j]; j++) {
}
for (t = i; t > j; t--) {
data[t] = data[t - 1];
}
data[j] = tmp;
}
从第二个元素开始,在已排序部分找到插入位置后,将其后数后移,再插入
二:直接选择排序
开始假设第一个数为最小数,遍历一次数组寻找最小数。
遍历一次后将最小数和未排序部分第一个元素交换位置。
for (i = 0; i < count - 1; i++) {
minIndex = i;
for (j = i; j < count; j++) {
if (data[j] < data[minIndex]) {
minIndex = j;
}
}
if (minIndex != i) {
tmp = data[i];
data[i] = data[minIndex];
data[minIndex] = tmp;
}
}
三:直接交换排序
从第一个元素开始,若后一元素比前一元素小,则两元素交换。
int hasSwap = 1;
for (i = 0; hasSwap && i < count - 1; i++) {
hasSwap = 0;
for (j = 0; j < count - i - 1; j++) {
if (data[j] > data[j+1]) {
tmp = data[j];
data[j] = data[j+1];
data[j+1] = tmp;
hasSwap = 1;
}
}
}
注:增加效率方法:若某次遍历没有交换,则说明数组已经排序完成。
外层遍历只需遍历到倒数第二个元素,内层遍历不需要遍历到已经排序完(即最后几个元素)的元素。