典型的なソートアルゴリズム(C言語実装)
「データ構造(C言語版)」の最後の実験作業(ソート)は、以下のように要求される.
データ構造実験5:並べ替え要求:1、直接挿入並べ替え;2、shellソート;3、簡単にソートを選択する;4、クイックソート;5、スタックの順序付け(選択);
私(@tongtongxyz)の宿題を共有しましょう.
データ構造実験5:並べ替え要求:1、直接挿入並べ替え;2、shellソート;3、簡単にソートを選択する;4、クイックソート;5、スタックの順序付け(選択);
私(@tongtongxyz)の宿題を共有しましょう.
/***************************************
* Filename: sort.cpp *
* Function: *
* Author: TongtongXyz *
* Weibo: @tongtongxyz *
* Date: 20130112 *
***************************************/
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 //
typedef int KeyType;
typedef int InfoType;
typedef struct{
KeyType key;
InfoType otherinfo;
}RedType;
typedef struct{
RedType r[MAXSIZE+1];
int length;
}SqList;
typedef SqList HeapType;
void InsertSort(SqList &L){
//
int i, j;
for(i = 2; i <= L.length; ++i){
if(L.r[i].key < L.r[i-1].key){
L.r[0] = L.r[i];
L.r[i] = L.r[i-1];
for(j = i - 2; L.r[0].key < L.r[j].key; --j){
L.r[j+1] = L.r[j];
}
L.r[j+1] = L.r[0];
}
}
}
void SortOutput(SqList &L){
printf(" :
");
for(int i = 1; i <= L.length; i++){
printf("%d ", L.r[i].key);
}
printf("
");
}
void SortInput(SqList &L, KeyType key){
L.r[++L.length].key = key;
}
void ShellInsert(SqList &L, int dk){
int i, j;
for(i = dk + 1; i <= L.length; ++i){
if(L.r[i].key < L.r[i-dk].key){
L.r[0] = L.r[i];
for(j = i - dk; j > 0 && L.r[0].key < L.r[j].key; j -= dk){
L.r[j+dk] = L.r[j];
}
L.r[j+dk] = L.r[0];
}
}
}
void ShellSort(SqList &L, int dlta[], int t){
//shell
int k;
for(k = 0; k < t; ++k){
dlta[k] = 2^(t-k+1) - 1;
ShellInsert(L, dlta[k]);
}
}
int SelectMinKey(SqList L, int i){
KeyType minkey;
for(minkey = i; i <= L.length; i++){
if(L.r[minkey].key > L.r[i].key){
minkey = i;
}
//minkey = ((L.r[i].key < L.r[i+1].key) ? i : (i+1));
}
return minkey;
}
void SelectSort(SqList &L){
//
int i, j;
for(i = 1; i < L.length; ++i){
j = SelectMinKey(L, i);
if(i != j){
L.r[0] = L.r[i];
L.r[i] = L.r[j];
L.r[j] = L.r[0];
}
}
}
int Partition(SqList &L, int low, int high){
KeyType pivotkey;
L.r[0] = L.r[low];
pivotkey = L.r[low].key;
while(low < high){
while(low < high && L.r[high].key >= pivotkey){
--high;
}
L.r[low] = L.r[high];
while(low < high && L.r[low].key<= pivotkey){
++low;
}
L.r[high] = L.r[low];
}
L.r[low] = L.r[0];
return low;
}
void Qsort(SqList &L, int low, int high){
KeyType pivotloc;
if(low < high){
pivotloc = Partition(L, low, high);
Qsort(L, low, pivotloc - 1);
Qsort(L, pivotloc + 1, high);
}
}
void QuickSort(SqList &L){
//
Qsort(L, 1, L.length);
}
void HeapAdjust(HeapType &H, int s, int m){
RedType rc;
int j;
rc = H.r[s];
for(j = 2 * s; j <= m; j *= 2){
if(j < m && H.r[j].key < H.r[j+1].key){
++j;
}
if(!(rc.key < H.r[j].key)){
break;
}
H.r[s] = H.r[j]; s = j;
}
H.r[s] = rc;
}
void HeapSort(HeapType &H){
//
int i;
for(i = H.length/2; i > 0; --i){
HeapAdjust(H, i, H.length);
}
for(i = H.length; i > 1; --i){
H.r[0] = H.r[1];
H.r[1] = H.r[i];
H.r[i] = H.r[0];
HeapAdjust(H, 1, i - 1);
}
}
int main(void){
SqList L;
L.length = 0;
int t = 4; //shell t
int dlta[t]; //shell dlta[]
KeyType key;
while(1){
int option;
printf(" :
1. ;
2. shell
3.
4.
5.
:“ctrl+c” ,“ctrl+z” EOF
:");
scanf("%d", &option);
printf(" ( EOF ) :");
while(scanf("%d", &key) != EOF){
SortInput(L, key);
}
switch(option){
case 1 :
InsertSort(L);
break;
case 2 :
ShellSort(L, dlta, t);
break;
case 3 :
SelectSort(L);
break;
case 4 :
QuickSort(L);
break;
case 5 :
HeapSort(L);
break;
default:
printf(" , !
");
}
SortOutput(L);
}
return 0;
}