所谓索引数组排序就是在不改变原来数组顺序对情况下对其排序,这样才能适应大部分应用中对排序需求。
冒泡排序
#include <stdio.h>
int main(int argc, const char * argv[])
{
int array[] = {1, 4, 7, 2, 5, 8, 3, 6, 9};
int count = sizeof(array) / sizeof(array[0]); //计算数组中元素的个数
int index[count]; //索引数组
int flag = 1; //标识位,它的作用在于优化冒泡排序,置1的状态为无序状态,0为有序状态
for (int i = 0; i < count; i++) {
index[i] = i; //遍历给索引数组赋值为原数组的下标
}
for (int i = 0; i < count - 1 && 1 == flag; i++) { //在这里判断是否是无序状态,如果有序,就不用排序了
flag = 0; //每次进循环排序前假定有序状态
for (int j = 0; j < count - i - 1; j++) {
if (array[index[j]] > array[index[j + 1]]) { //相邻元素之间依次比较大小
int temp = 0;
temp = index[j];
index[j] = index[j + 1];
index[j + 1] = temp;
flag = 1; //如果发生了数据交换,那么肯定是无序状态,给它置一,再次进循环排序
}
}
}
for (int i = 0; i < count; i++) {
printf("array[%d] = %d\n", index[i], array[index[i]]);
}
return 0;
}
选择排序
#include <stdio.h>
int main(int argc, const char * argv[])
{
int array[] = {1, 4, 7, 2, 5, 8, 3, 6, 9};
int count = sizeof(array) / sizeof(array[0]); //计算数组中元素的个数
int index[count]; //索引数组
for (int i = 0; i < count; i++) {
index[i] = i; //遍历给索引数组赋值为原数组的下标
}
for (int i = 0; i < count - 1; i++) {
int flag = i;
for (int j = flag + 1; j < count; j++) {
if (array[index[flag]] > array[index[j]]) {
flag = j;
}
}
int temp = 0;
temp = index[flag];
index[flag] = index[i];
index[i] = temp;
}
for (int i = 0; i < count; i++) {
printf("array[%d] = %d\n", index[i], array[index[i]]);
}
return 0;
}
插入排序
#include <stdio.h>
int main(int argc, const char * argv[])
{
int array[] = {1, 4, 7, 2, 5, 8, 3, 6, 9};
int count = sizeof(array) / sizeof(array[0]); //计算数组中元素的个数
int index[count]; //索引数组
for (int i = 0; i < count; i++) {
index[i] = i; //遍历给索引数组赋值为原数组的下标
}
for (int i = 1; i < count ; i++) {
int j = i;
int temp = index[j];
while (j > 0 && array[temp] < array[index[j - 1]]) {
index[j] = index[j - 1];
j--;
}
index[j] = temp;
}
for (int i = 0; i < count; i++) {
printf("array[%d] = %d\n", index[i], array[index[i]]);
}
return 0;
}