排序算法

1、冒泡排序

void bubble(int arr[],int len) {
	bool flag = 0;
	int tmp = 0;
	for (int i = 0; i < len;i++) {
		flag = 0;
		for (int j = 0; j < len - i-1;j++) {
			if (arr[j]>arr[j+1]) {
				flag = 1;
				tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
		if (flag == 0)
			break;
	}
}

2、選擇排序

void simplechoose(int arr[],int len) {
	int tmp;
	int index = 0;
	for (int i = 0; i < len;i++) {
		tmp = arr[i];
		index = i;
		for (int j = i; j < len;j++) {
			if (arr[j] < tmp) {
				tmp = arr[j];
				index = j;
			}		
		}
		int val = arr[i];
		arr[i] = arr[index];
		arr[index] = val;
	}
}

3、快速排序

  void quicksort(int arr[],int left,int right) {
    	int i = left, j = right;
    	int tmp = arr[i];
    	while (i<j) {
    		while (i < j&&tmp < arr[j]) j--;
    		if (i<j) {
    			arr[i] = arr[j];
    			i++;
    		}
    		while (i<j&&tmp>arr[i]) i++;
    		if (i<j) {
    			arr[j] = arr[i];
    			j--;
    		}
    	}
    	arr[i] = tmp;
    	if (left < i) { quicksort(arr, left, i-1); }
    	if (i < right) { quicksort(arr, i + 1, right); }
    }

4、插入排序

    void insertsort(int arr[],int len) {
    	for (int i = 1; i <=len;i++) {	
    		int tmp = arr[i]; 
    		int j = i;
    		while (j>0&&arr[j-1]>tmp) {
    			arr[j] = arr[j - 1];
    			j--;
    		}
    		arr[j] = tmp;
    	}
    }

5、希爾排序

void xier(int arr[],int len) {
	int gap = len / 2;
	for (; gap > 0;gap=gap/2) {

		for (int i = gap; i < len;i++) {
			int tmp = arr[i];
			int j = i;
			while (j > 0 && arr[j - gap] > tmp){
				arr[j] = arr[j - gap];
				j = j - gap;
			}
			arr[j] = tmp;
		}	
	}
}

6、歸併排序

int fuzhu[6] = { 0 };
void merge(int arr[],int left,int lr,int rl,int right) {
	int k = left;
	int i = left;
	while (left<=lr&&rl<=right) {
		if (arr[left]<arr[rl]) {
			fuzhu[k++] = arr[left++];
		}
		else {
			fuzhu[k++] = arr[rl++];
		}
	}
	while (left<=lr) {
		fuzhu[k++] = arr[left++];
	}
	while (rl<=right) {
		fuzhu[k++] = arr[rl++];
	}
	for (; i <= right;i++) {
		arr[i] = fuzhu[i];
	}
}

void guibing(int arr[],int left,int right) {
	int i = left, j = right;
	if (left<right) {
		int mid = left + (right - left) / 2;
		guibing(arr, left,mid);
		guibing(arr,mid+1,right);
		merge(arr,left,mid,mid+1,right);
	}
}

7、堆排序

void swap(int arr[], int a, int b) {
	int temp = arr[a];
	arr[a] = arr[b];
	arr[b] = temp;
}

void adjust(int arr[],int i,int len) {
	int maxindex = i;

	if (i * 2 + 1 < len && arr[i * 2 + 1] > arr[maxindex])
		maxindex = i * 2 + 1;
	if (i * 2 + 2 < len && arr[i * 2 + 2] > arr[maxindex])
		maxindex = i * 2 + 2;
	if (maxindex!=i) {
		swap(arr, i, maxindex);
		adjust(arr,maxindex,len);
	}
}

void heapsort(int arr[],int len) {
	
	for (int i=len/2-1; i >= 0;i--) {
		adjust(arr,i,len);
	}
	int tmp = 0;
	for (int j = len-1; j >= 0;j--) {
		swap(arr, 0, j);
		adjust(arr, 0 ,j);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章