表排序说白了,就是当待排序的元素是一个个庞大的结构体等其他数据结构时,就新创建个数组用来存放排序后的排序好的新的位置,但是在原来的待排序的数组中不做交换等改变。
当table[i]=i,就代表书在本来的位置上,因此每次把key放回原来的位置时,就把table[i]=i。当检测到table[i]=i,意味着这个环结束排序了
思路
新建一个表去记录排序后的位置,并且记得根据新建表去更改原表
代码
//表排序.c
#include<stdio.h>
#include<string.h>
typedef int ElementType;
void Swap(int *X,int *Y)
{
int tmp = *X;
*X = *Y;
*Y = tmp;
}
void Insertion_Sort(char str[],ElementType A[], int N)
{/*原来的插入排序*/
int i = 0;
for(int P=1;P<N;P++) {
int Tmp = A[P];
for(i = P;i>0 && str[A[i-1]]>str[Tmp];i--)
A[i] = A[i-1];
A[i] = Tmp;
}
}
void Print_Array(ElementType A[],int N)
{
printf("\n");
for(int i=0;i<N;i++)
printf("%d ",A[i]);
}
void table_sort(char str[],int table[],int N)
{
int flag[N];
char str1[N+1];
int cnt=0;
for(int i=0;i<N;i++)
flag[i] = 0;
for(int i=0;i<N;i++)
{
if(flag[table[i]]==0)
{
str1[cnt++] = str[table[i]];
flag[table[i]] = 1;
}
}
str1[cnt]='\0';
printf("\n\n\n");
for(int i=0;i<N;i++)
printf("%c ",str1[i] );
}
int main()
{
char str[9] = {'f','d','c','a','g','b','h','e'};
int table[8];
for(int i=0;i<9;i++)
printf("%c ",str[i]);
for(int i=0;i<8;i++)
table[i] = i;
Insertion_Sort(str,table,8);
Print_Array(table,8);
table_sort(str,table,8);
return 0;
}