内部排序
插入
直接
void insert(int arr[],int n){
int i,j;
for(i=1;i<n;i++){
int key=arr[i];
for(j=i-1;j>=0&&arr[j]>key;j--){
arr[j+1]=arr[j];
}
arr[j+1]=key;
}
}
折半
void bininsert(int arr[],int n){
int i,j,left,mid,right;
for(i=1;i<n;i++){
int key=arr[i];
for(left=0,right=i-1;left<=right;){
mid=(left+right)/2;
if(key<arr[mid]){
right=mid-1;
}else{
left=mid+1;
}
}
for(j=i-1;j>right;j--){
arr[j+1]=arr[j];
}
arr[right+1]=key;
}
}
二路
void twoRoad(int arr[],int n){
int *brr=(int *)malloc(sizeof(arr[0]*n));
int left=-1,right=n;
int i,j;
for(i=0;i<n;i++){
if(left==-1||arr[i]>brr[0]){
for(j=left;j>=0&&arr[i]<brr[j];j--){
brr[j+1]=brr[j];
}
brr[j+1]=arr[i];
left++;
}
else{
for(j=right;j<n&&arr[i]>brr[j];j++){
brr[j-1]=brr[j];
}
brr[j-1]=arr[i];
right--;
}
}
for(i=right;i<n;i++){
arr[i-right]=brr[i];
}
for(j=0;j<=left;j++){
arr[n-right+j]=brr[j];
}
}
希尔
void Shell(int arr[],int n){
int i,j,step;
for(step=n/2;step>0;step/=2){
for(i=step;i<n;i++){
int key=arr[i];
for(j=i-step;j>=0&&arr[j]>key;j-=step){
arr[j+step]=arr[j];
}
arr[j+step]=key;
}
}
}
选择
直接
void choice(int arr[],int n){
int max,i,j;
for(i=0;i<n-1;i++){
max=0;
for(j=1;j<n-i;j++){
if(arr[max]<arr[j]){
max=j;
}
}
if(max!=n-1-i){
int temp=arr[n-1-i];
arr[n-1-i]=arr[max];
arr[max]=temp;
}
}
}
二路
void twochoice(int arr[],int n){
int max,min,i,j;
for(i=0;i<n/2;i++){
min=max=i;
for(j=i+1;j<n-i;j++){
if(arr[max]<arr[j]){
max=j;
}else if(arr[min]>arr[j]){
min=j;
}
}
if(max!=n-1-i){
int temp=arr[n-1-i];
arr[n-1-i]=arr[max];
arr[max]=temp;
}
if(min==n-1-i){
min=max;
}
if(min!=i){
int temp=arr[i];
arr[i]=arr[min];
arr[min]=temp;
}
}
}
堆
void reHeap(int arr[],int index,int n){
int child=index*2+1;
int key=arr[index];
while(child<n){
if(child+1<n&&arr[child+1]>arr[child]){
++child;
}if(key<arr[child]){
arr[index]=arr[child];
index=child;
child=2*index+1;
}else{
break;
}
}
arr[index]=key;
}
void heapSort(int arr[],int n){
int i;
for(i=n/2;i>=0;i--){
reHeap(arr,i,n);
}
for(i=0;i<n-1;i++){
int temp=arr[0];
arr[0]=arr[n-i-1];
arr[n-1-i]=temp;
reHeap(arr,0,n-1-i);
}
}
交换
冒泡
void bubbleSort(int arr[],int n){
int i,j;
for(i=0;i<n-1;i++){
int swap=false;
for(j=1;j<n-i;j++){
if(arr[j]<arr[j-1]){
int tmp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = tmp;
swap = true;
}
}
if(!swap){
break;
}
}
}
鸡尾酒
void cooktailSort(int arr[],int n){
int i,j,temp;
for(i=0;i<n/2;i++){
int swap=false;
for(j=i+1;j<n-i;j++){
if(arr[j]<arr[j-1]){
temp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
swap=true;
}
}
for(j=j-2;j>i;j--){
if(arr[j]<arr[j-1]){
temp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
swap=true;
}
}
if(!swap){
break;
}
}
}
快速
void quickSort(int arr[],int n){
if(n<=1){
return ;
}
int key=arr[0];
int i,j;
for(i=0,j=n-1;i<j;){
while(i<j&&arr[j]>=key)--j;
if(i<j) arr[i++]=arr[j];
while(i<j&&arr[i]<=key)++i;
if(i<j) arr[j--]=arr[i];
}
arr[i]=key;
if(i>1){
quickSort(arr,i);
}
if(n-i-1>1){
quickSort(arr+1+i,n-i-1);
}
}
归并
二路归并
void meger(int arr[],int n){
int mid=n/2;
int brr[mid];
int i,j,k;
for(i=0;i<mid;i++){
brr[i]=arr[i];
}
i=0,j=mid,k=0;
while(i<mid&&j<n){
if(brr[i]<arr[j]){
arr[k++]=brr[i++];
}else{
arr[k++]=arr[j++];
}
}
while(i<mid){
arr[k++]=brr[i++];
}
}
void megerSort(int arr[],int n){
if(n<=1){
return ;
}
megerSort(arr,n/2);
megerSort(arr+n/2,n-n/2);
meger(arr,n);
}
基数
void baseSort(int arr[],int n){
SlinketList list[10]={NULL};
int i,j;
for(i=0;i<n;i++){
list[i]=slinket_list_create();
}
int max=arr[0];
for(j=0;j<n;j++){
if(arr[j]>max){
max=arr[j];
}
}
int div=1;
for(;max/div!=0;div*=10){
for(i=0;i<n;i++){
int w=arr[i]/div%10;
slinket_list_insert_back(list[w],arr[i]);
}
for(i=0,j=0;i<10;i++){
while(!slinket_list_is_empty(list[i])){
slinket_list_delete_front(list[i],&arr[j]);
++j;
}
}
}for(i=0;i<10;i++){
slinket_list_destroy(list[i]);
}
}
#include "linkedlist.h"
SLinketList slinket_list_create(void){
struct Node* head = (struct Node*)malloc(NODESIZE);
if(head==NULL){
return NULL;
}
head->next = NULL;
return head;
}
bool slinket_list_is_empty(SLinketList head){
return head->next == NULL;
}
size_t slinket_list_size(SLinketList head){
size_t size = 0;
struct Node *node = head->next;
while(node != NULL){
size++;
node = node->next;
}
return size;
}
static struct Node * slinket_list_get_prev_node(SLinketList head,size_t pos){
struct Node *node = head;
size_t i;
for(i=0;node!=NULL&&i<pos;i++){
node = node->next;
}
return node;
}
int slinket_list_insert(SLinketList head,size_t pos,ETYPE elem){
struct Node *prev = slinket_list_get_prev_node(head,pos);
if(prev == NULL){
return -1;
}
struct Node *node = (struct Node *)malloc(NODESIZE);
if(node==NULL){
return -2;
}
node->elem = elem;
node->next = prev->next;
prev->next = node;
return 0;
}
int slinket_list_insert_front(SLinketList head,ETYPE elem){
struct Node *node = (struct Node *)malloc(NODESIZE);
if(node==NULL){
return -1;
}
node->elem = elem;
node->next = head->next;
head->next = node;
return 0;
}
int slinket_list_insert_back(SLinketList head,ETYPE elem){
struct Node *last = head;
while(last->next!=NULL){
last = last->next;
}
struct Node *node = (struct Node *)malloc(NODESIZE);
node->elem = elem;
node->next = NULL;
last->next = node;
return 0;
}
int slinket_list_delete(SLinketList head,size_t pos,ETYPE *pelem){
struct Node *prev = slinket_list_get_prev_node(head,pos);
if(prev == NULL || prev->next == NULL){
return -1;
}
struct Node *curr = prev->next;
prev->next = curr->next;
*pelem = curr->elem;
free(curr);
return 0;
}
int slinket_list_delete_front(SLinketList head,ETYPE *pelem){
if(head->next == NULL){
return -1;
}
*pelem = head->next->elem;
struct Node *first = head->next;
head->next = first->next;
free(first);
return 0;
}
int slinket_list_delete_back(SLinketList head,ETYPE *pelem){
if(head->next == NULL){
return -1;
}
struct Node *lastSec = head;
while(lastSec->next->next != NULL){
lastSec = lastSec->next;
}
*pelem = lastSec->next->elem;
free(lastSec->next);
lastSec->next = NULL;
return 0;
}
int slinket_list_get(SLinketList head,size_t pos,ETYPE *pelem){
struct Node *node = slinket_list_get_prev_node(head,pos+1);
if(node == NULL){
return -1;
}
*pelem = node->elem;
return 0;
}
int slinket_list_get_front(SLinketList head,ETYPE *pelem){
if(head->next == NULL){
return -1;
}
*pelem = head->next->elem;
return 0;
}
int slinket_list_get_back(SLinketList head,ETYPE *pelem){
if(head->next == NULL){
return -1;
}
struct Node *last = head->next;
while(last->next != NULL){
last = last->next;
}
*pelem = last->elem;
return 0;
}
int slinket_list_find(SLinketList head,ETYPE *pelem){
struct Node *node = head->next;
size_t i;
for(i=0;node!=NULL;node=node->next,i++){
if(node->elem == *pelem){
return i;
}
}
return -1;
}
void slinket_list_travel(SLinketList head,void (*travel)(int)){
struct Node *node = head->next;
while(node!=NULL){
travel(node->elem);
node = node->next;
}
}
void slinket_list_clear(SLinketList head){
struct Node *node,*next;
for(node=head->next;node!=NULL;node=next){
next = node->next;
free(node);
}
head->next = NULL;
}
void slinket_list_destroy(SLinketList head){
slinket_list_clear(head);
free(head);
}
计数
void countSort(int arr[],int n){
int i,j;
int min=arr[0],max=arr[0];
for(i=0;i<n;i++){
if(arr[i]>max){
max=arr[i];
}
if(arr[i]<min){
min=arr[i];
}
}
int count=max-min+1;
int *cout=calloc(count,sizeof(int));
for(i=0;i<n;i++){
cout[arr[i]-min]++;
}
for(i=0,j=0;i<count;i++){
while(cout[i]){
arr[j++]=i+min;
--cout[i];
}
}
free(cout);
}
外部排序
二/多路归并排序
提升外部排序性能:减少IO次数
增加归并路数 败者树
减少初始归并段数 置换选择排序