七大排序算法
#include<iostream>
using namespace std;
//swap
void swap(int &a,int &b){
int temp;
temp = a;
a = b;
b= temp;
}
//冒泡排序
void BubbleSort(int *a,int n){
int i = n;
int temp;
while(i>0){
int pos = 0;
for(int j = 0;j < n;j++){
if(a[j] > a[j+1]){
temp = a[j];
a[j] = a[j+1];
a[j+1]= temp;
pos = j;
}
i = pos;
}
}
}
//快速排序
int partition(int *a, int low, int high){
int key = a[low];
while(low<high) {
while(low<high && key<=a[high])
high--;
swap(a[low],a[high]);
while(low<high && key>=a[low])
low++;
swap(a[low],a[high]);
}
return low;
}
void quickSort(int *a,int low, int high){
if(low<high){
int pos = partition(a,low,high);
quickSort(a,low,pos-1);
quickSort(a,pos+1,high);
}
}
//选择排序
void choiceSort(int *a,int n){
int minindex;
for(int i=0;i<n;i++){
for(int j = i;j<n;j++){
minindex = i;
if(a[j]<a[minindex]){
minindex = j;
}
}
swap(a[minindex],a[i]);
}
}
//堆排序
void adjustDown(int *a,int i,int n){
int j=i*2+1;
while(j<n){
if(j+1<n && a[j]>a[j+1])
j++;
if(a[i]<a[j])
break;
swap(a[i],a[j]);
i = j;
j = i*2+1;
}
}
void makeHeap(int *a,int n){
int i=0;
for(i = n/2-1;i>=0;i--){
adjustDown(a,i,n);
}
}
void heapSort(int *a, int n){
int i = 0;
makeHeap(a,n);
for(i=n-1;i>=0;i--){
swap(a[i],a[0]);
adjustDown(a,0,i);
}
}
//插入排序
void insertSort(int *a,int n){
for(int i=1;i<n;i++){
for(int end=i-1;end>=0;--end){
if(a[end]>a[end+1]){
swap(a[end],a[end+1]);
}
else
break;
}
}
}
//希尔排序
void shellSort(int *a,int n){
int index = n/2;
int temp = 0;
while(index>=1){
cout << "index=" << index << endl;
for(int i = index;i<n;i++){
cout << "i=" << i << endl;
for(int j = i-index;j>=0;j-=index){
cout << j << " "<<j+index << endl;
if(a[j]>a[j+index]){
//cout << j << " "<<j+index << endl;
swap(a[j],a[j+index]);
}
}
}
index = index/2;
}
}
//归并排序
void merge(int *a, int start, int mid, int end)
{
int *tmp = (int *)malloc((end-start+1)*sizeof(int)); // tmp是汇总2个有序区的临时区域
int i = start; // 第1个有序区的索引
int j = mid + 1; // 第2个有序区的索引
int k = 0; // 临时区域的索引
while(i <= mid && j <= end){
if (a[i] <= a[j])
tmp[k++] = a[i++];
else
tmp[k++] = a[j++];
}
while(i <= mid)
tmp[k++] = a[i++];
while(j<=end)
tmp[k++] = a[j++];
// 将排序后的元素,全部都整合到数组a中。
for (int i = 0; i < k; i++)
a[start + i] = tmp[i];
free(tmp);
}
void mergeSort(int *a, int start, int end){
if(a==NULL || start >= end)
return ;
int mid = (end + start)/2;
mergeSort(a, start, mid); // 递归排序a[start...mid]
mergeSort(a, mid+1, end); // 递归排序a[mid+1...end]
// a[start...mid] 和 a[mid...end]是两个有序空间,
// 将它们排序成一个有序空间a[start...end]
merge(a, start, mid, end);
}
//打印数组
void pt(int *a,int s,int n){
for(int i=s;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
int main(){
int a[8] = {1,4,3,5,2,9,7,6};
//BubbleSort(a,5);
//quickSort(a,0,4);
mergeSort(a,0,8);
pt(a,0,8);
}
浙公网安备 33010602011771号